From 25e9d6fb28b088d19565bd0f9e791ce7581fa957 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Sat, 17 Mar 2018 16:55:49 -0400 Subject: [PATCH 1/9] 2018-03-17 Fred Gleason * Added support for DMA bus-mastering to the HPI driver. --- ChangeLog | 2 + rdhpi/rdhpiplaystream.cpp | 179 ++++++++++++++++++++++------------- rdhpi/rdhpiplaystream.h | 3 +- rdhpi/rdhpirecordstream.cpp | 182 ++++++++++++++++++++++-------------- rdhpi/rdhpirecordstream.h | 4 +- rdhpi/rdhpisoundcard.cpp | 180 +++++++++++++++++++---------------- rdhpi/rdhpisoundcard.h | 2 +- 7 files changed, 329 insertions(+), 223 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23b81863..817ce800 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16610,3 +16610,5 @@ 2018-02-22 Fred Gleason * Updated 'NEWS'. * Incremented the package version to 2.19.0. +2018-03-17 Fred Gleason + * Added support for DMA bus-mastering to the HPI driver. diff --git a/rdhpi/rdhpiplaystream.cpp b/rdhpi/rdhpiplaystream.cpp index 7fd823c5..929327a3 100644 --- a/rdhpi/rdhpiplaystream.cpp +++ b/rdhpi/rdhpiplaystream.cpp @@ -2,7 +2,7 @@ // // A class for playing Microsoft WAV files. // -// (C) Copyright 2002-2007,2016 Fred Gleason +// (C) Copyright 2002-2007,2016-2018 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -66,7 +66,10 @@ RDHPIPlayStream::RDHPIPlayStream(RDHPISoundCard *card,QWidget *parent) // hpi_err_t hpi_err; int quan; uint16_t type[HPI_MAX_ADAPTERS]; + struct hpi_format fmt; + uint32_t dma_size=0; + dma_buffer_size=0; sound_card=card; card_number=-1; stream_number=-1; @@ -94,16 +97,28 @@ RDHPIPlayStream::RDHPIPlayStream(RDHPISoundCard *card,QWidget *parent) card_index[i]=i; } #else - LogHpi(HPI_SubSysGetNumAdapters(NULL,&quan)); + LogHpi(HPI_SubSysGetNumAdapters(NULL,&quan),__LINE__); for(int i=0;igetCardOutputStreams(card_number);i++) { - if(HPI_OutStreamOpen(NULL,card_index[card_number],i,&hostream)==0) { + if(LogHpi(HPI_OutStreamOpen(NULL,card_index[card_number],i,&hostream), + __LINE__)==0) { + syslog(LOG_NOTICE,"buffer_size: %u\n",dma_buffer_size); found=true; break; } @@ -179,6 +196,11 @@ bool RDHPIPlayStream::formatSupported(RDWaveFile::Format format) if(!found) { return false; } + if(LogHpi(HPI_OutStreamHostBufferAllocate(NULL,hostream,dma_buffer_size), + __LINE__)!=0) { + LogHpi(HPI_OutStreamClose(NULL,hostream),__LINE__); + return false; + } } else { hostream=hpi_stream; @@ -187,36 +209,46 @@ bool RDHPIPlayStream::formatSupported(RDWaveFile::Format format) case RDWaveFile::Pcm16: LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), HPI_FORMAT_PCM16_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), + __LINE__); break; case RDWaveFile::Pcm24: LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), HPI_FORMAT_PCM24_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), + __LINE__); break; case RDWaveFile::MpegL1: LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), HPI_FORMAT_MPEG_L1, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), + __LINE__); break; case RDWaveFile::MpegL2: LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), HPI_FORMAT_MPEG_L2, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), + __LINE__); break;; case RDWaveFile::MpegL3: LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), HPI_FORMAT_MPEG_L3, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), + __LINE__); break; default: @@ -224,7 +256,8 @@ bool RDHPIPlayStream::formatSupported(RDWaveFile::Format format) break; } if(!is_open) { - LogHpi(HPI_OutStreamClose(NULL,hostream)); + LogHpi(HPI_OutStreamHostBufferFree(NULL,hostream),__LINE__); + LogHpi(HPI_OutStreamClose(NULL,hostream),__LINE__); } if(state!=0) { return false; @@ -396,10 +429,10 @@ bool RDHPIPlayStream::play() if((!playing)&&(!is_paused)) { LogHpi(HPI_OutStreamSetTimeScale(NULL,hpi_stream, (uint16_t)((RD_TIMESCALE_DIVISOR/(double)play_speed)* - HPI_OSTREAM_TIMESCALE_UNITS))); - if(HPI_OutStreamGetInfoEx(NULL,hpi_stream, - &state,&buffer_size,&data_to_play, - &samples_played,&reserved)!=0) { + HPI_OSTREAM_TIMESCALE_UNITS)),__LINE__); + if(LogHpi(HPI_OutStreamGetInfoEx(NULL,hpi_stream, + &state,&buffer_size,&data_to_play, + &samples_played,&reserved),__LINE__)!=0) { return false; } fragment_size=buffer_size/4; @@ -420,25 +453,25 @@ bool RDHPIPlayStream::play() case 8: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_PCM8_UNSIGNED, - getSamplesPerSec(),0,0)); + getSamplesPerSec(),0,0),__LINE__); break; case 16: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_PCM16_SIGNED, - getSamplesPerSec(),0,0)); + getSamplesPerSec(),0,0),__LINE__); break; case 24: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_PCM24_SIGNED, - getSamplesPerSec(),0,0)); + getSamplesPerSec(),0,0),__LINE__); break; case 32: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_PCM32_SIGNED, - getSamplesPerSec(),0,0)); + getSamplesPerSec(),0,0),__LINE__); break; default: - LogHpi(HPI_AdapterClose(NULL,card_index[card_number])); + LogHpi(HPI_AdapterClose(NULL,card_index[card_number]),__LINE__); return false; break; } @@ -448,20 +481,23 @@ bool RDHPIPlayStream::play() case 1: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_MPEG_L1,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags())); + getHeadBitRate(),getHeadFlags()), + __LINE__); break; case 2: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_MPEG_L2,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags())); + getHeadBitRate(),getHeadFlags()), + __LINE__); break; case 3: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_MPEG_L3,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags())); + getHeadBitRate(),getHeadFlags()), + __LINE__); break; default: - LogHpi(HPI_AdapterClose(NULL,card_index[card_number])); + LogHpi(HPI_AdapterClose(NULL,card_index[card_number]),__LINE__); return false; } break; @@ -469,7 +505,8 @@ bool RDHPIPlayStream::play() return false; } #if HPI_VER < 0x00030500 - if(HPI_DataCreate(&hpi_data,&format,pdata,fragment_size)!=0) { + if(LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,fragment_size),__LINE__)!= + 0) { return false; } #endif @@ -488,15 +525,15 @@ bool RDHPIPlayStream::play() } readWave(pdata,read_bytes); #if HPI_VER > 0x00030500 - LogHpi(HPI_OutStreamWriteBuf(NULL,hpi_stream,pdata,read_bytes,&format)); + LogHpi(HPI_OutStreamWriteBuf(NULL,hpi_stream,pdata,read_bytes,&format), + __LINE__); #else - LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,read_bytes)); - LogHpi(HPI_OutStreamWrite(NULL,hpi_stream,&hpi_data)); + LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,read_bytes),__LINE__); + LogHpi(HPI_OutStreamWrite(NULL,hpi_stream,&hpi_data),__LINE__); #endif - if(HPI_OutStreamStart(NULL,hpi_stream)!=0) { + if(LogHpi(HPI_OutStreamStart(NULL,hpi_stream),__LINE__)!=0) { return false; } - clock->start(50); clock->start(FRAGMENT_TIME); playing=true; is_paused=false; @@ -513,7 +550,7 @@ bool RDHPIPlayStream::play() } } if((!playing)&(is_paused|repositioned)) { - LogHpi(HPI_OutStreamStart(NULL,hpi_stream)); + LogHpi(HPI_OutStreamStart(NULL,hpi_stream),__LINE__); clock->start(FRAGMENT_TIME); playing=true; stopping=false; @@ -543,10 +580,11 @@ void RDHPIPlayStream::pause() return; } if(playing) { - LogHpi(HPI_OutStreamStop(NULL,hpi_stream)); + LogHpi(HPI_OutStreamStop(NULL,hpi_stream),__LINE__); clock->stop(); LogHpi(HPI_OutStreamGetInfoEx(NULL,hpi_stream,&state,&buffer_size, - &data_to_play,&samples_played,&reserved)); + &data_to_play,&samples_played,&reserved), + __LINE__); switch(getFormatTag()) { case WAVE_FORMAT_PCM: samples_pending=data_to_play/(getChannels()*getBitsPerSample()/8); @@ -580,12 +618,12 @@ void RDHPIPlayStream::stop() return; } if(playing|is_paused) { - LogHpi(HPI_OutStreamStop(NULL,hpi_stream)); + LogHpi(HPI_OutStreamStop(NULL,hpi_stream),__LINE__); clock->stop(); playing=false; is_paused=false; seekWave(0,SEEK_SET); - LogHpi(HPI_OutStreamReset(NULL,hpi_stream)); + LogHpi(HPI_OutStreamReset(NULL,hpi_stream),__LINE__); samples_pending=0; samples_skipped=0; stream_state=RDHPIPlayStream::Stopped; @@ -632,7 +670,7 @@ bool RDHPIPlayStream::setPosition(unsigned samples) is_paused=false; repositioned=true; } - LogHpi(HPI_OutStreamReset(NULL,hpi_stream)); + LogHpi(HPI_OutStreamReset(NULL,hpi_stream),__LINE__); samples_played=0; switch(getFormatTag()) { case WAVE_FORMAT_PCM: @@ -686,24 +724,25 @@ void RDHPIPlayStream::tickClock() char hpi_text[100]; int n; - hpi_err=HPI_OutStreamGetInfoEx(NULL,hpi_stream, - &state,&buffer_size,&data_to_play, - &samples_played,&reserved); + hpi_err=LogHpi(HPI_OutStreamGetInfoEx(NULL,hpi_stream, + &state,&buffer_size,&data_to_play, + &samples_played,&reserved),__LINE__); if(!stopping) { while((buffer_size-data_to_play)>=fragment_size) { n=readWave(pdata,fragment_size); if((n<=0)||(((uint32_t)n) 0x00030500 - if((hpi_err=HPI_OutStreamWriteBuf(NULL,hpi_stream, - pdata,n,&format))!=0) { + if((hpi_err=LogHpi(HPI_OutStreamWriteBuf(NULL,hpi_stream, + pdata,n,&format),__LINE__))!= + 0) { HPI_GetErrorText(hpi_err,hpi_text); fprintf(stderr,"*** HPI Error: %s ***\n",hpi_text); } #else HPI_DataCreate(&hpi_data,&format,pdata,n); - if((hpi_err=HPI_OutStreamWrite(NULL,hpi_stream, - &hpi_data))!=0) { + if((hpi_err=LogHpi(HPI_OutStreamWrite(NULL,hpi_stream, + &hpi_data),__LINE__))!=0) { HPI_GetErrorText(hpi_err,hpi_text); fprintf(stderr,"*** HPI Error: %s ***\n",hpi_text); } @@ -714,26 +753,28 @@ void RDHPIPlayStream::tickClock() } left_to_write-=n; #if HPI_VER > 0x00030500 - hpi_err=HPI_OutStreamWriteBuf(NULL,hpi_stream, - pdata,n,&format); + hpi_err=LogHpi(HPI_OutStreamWriteBuf(NULL,hpi_stream,pdata,n,&format), + __LINE__); #else - hpi_err=HPI_DataCreate(&hpi_data,&format,pdata,n); - hpi_err=HPI_OutStreamWrite(NULL,hpi_stream,&hpi_data); + hpi_err=LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,n),__LINE__); + hpi_err=LogHpi(HPI_OutStreamWrite(NULL,hpi_stream,&hpi_data),__LINE__); #endif - hpi_err=HPI_OutStreamGetInfoEx(NULL,hpi_stream, - &state,&buffer_size,&data_to_play, - &samples_played,&reserved); + hpi_err=LogHpi(HPI_OutStreamGetInfoEx(NULL,hpi_stream, + &state,&buffer_size,&data_to_play, + &samples_played,&reserved), + __LINE__); } } else { if(state==HPI_STATE_DRAINED) { - hpi_err=HPI_OutStreamStop(NULL,hpi_stream); - hpi_err=HPI_OutStreamClose(NULL,hpi_stream); - hpi_err=HPI_AdapterClose(NULL,card_index[card_number]); + LogHpi(HPI_OutStreamStop(NULL,hpi_stream),__LINE__); + LogHpi(HPI_OutStreamHostBufferFree(NULL,hpi_stream),__LINE__); + LogHpi(HPI_OutStreamClose(NULL,hpi_stream),__LINE__); + hpi_err=LogHpi(HPI_AdapterClose(NULL,card_index[card_number]),__LINE__); clock->stop(); playing=false; seekWave(0,SEEK_SET); - hpi_err=HPI_OutStreamReset(NULL,hpi_stream); + hpi_err=LogHpi(HPI_OutStreamReset(NULL,hpi_stream),__LINE__); samples_pending=0; samples_skipped=0; stream_state=RDHPIPlayStream::Stopped; @@ -761,7 +802,10 @@ int RDHPIPlayStream::GetStream() #ifdef RDHPIPLAYSTREAM_USE_LOCAL_MUTEX for(int i=0;igetCardOutputStreams(card_number);i++) { if(++stream_mutex[card_number][i]==1) { - LogHpi(HPI_OutStreamOpen(NULL,card_index[card_number],i,&hpi_stream)); + LogHpi(HPI_OutStreamOpen(NULL,card_index[card_number],i,&hpi_stream), + __LINE__); + LogHpi(HPI_OutStreamHostBufferAllocate(NULL,hpi_stream,dma_buffer_size), + __LINE__); stream_number=i; return stream_number; } @@ -772,7 +816,8 @@ int RDHPIPlayStream::GetStream() return -1; #else for(int i=0;igetCardOutputStreams(card_number);i++) { - if(HPI_OutStreamOpen(NULL,card_index[card_number],i,&hpi_stream)==0) { + if(LogHpi(HPI_OutStreamOpen(NULL,card_index[card_number],i,&hpi_stream), + __LINE__)==0) { stream_number=i; // syslog(LOG_ERR,"HPI allocating ostream: %d",stream_number); return stream_number; @@ -787,23 +832,25 @@ void RDHPIPlayStream::FreeStream() { #ifdef RDHPIPLAYSTREAM_USE_LOCAL_MUTEX stream_mutex[card_number][stream_number]--; - LogHpi(HPI_OutStreamClose(NULL,hpi_stream)); + LogHpi(HPI_OutStreamHostBufferFree(NULL,hpi_stream),__LINE__); + LogHpi(HPI_OutStreamClose(NULL,hpi_stream),__LINE__); stream_number=-1; #else - LogHpi(HPI_OutStreamClose(NULL,hpi_stream)); + LogHpi(HPI_OutStreamHostBufferFree(NULL,hpi_stream),__LINE__); + LogHpi(HPI_OutStreamClose(NULL,hpi_stream),__LINE__); // syslog(LOG_ERR,"HPI closing ostream: %d",stream_number); stream_number=-1; #endif } -hpi_err_t RDHPIPlayStream::LogHpi(hpi_err_t err) +hpi_err_t RDHPIPlayStream::LogHpi(hpi_err_t err,int lineno) { char err_txt[200]; if(err!=0) { HPI_GetErrorText(err,err_txt); - syslog(LOG_NOTICE,"HPI Error: %s",err_txt); + syslog(LOG_NOTICE,"HPI Error: %s, %s line %d",err_txt,__FILE__,lineno); } return err; } diff --git a/rdhpi/rdhpiplaystream.h b/rdhpi/rdhpiplaystream.h index 8562946c..39bdb2cd 100644 --- a/rdhpi/rdhpiplaystream.h +++ b/rdhpi/rdhpiplaystream.h @@ -87,7 +87,7 @@ class RDHPIPlayStream : public QObject,public RDWaveFile void Drained(); int GetStream(); void FreeStream(); - hpi_err_t LogHpi(hpi_err_t err); + hpi_err_t LogHpi(hpi_err_t err,int lineno); RDHPISoundCard *sound_card; RDHPIPlayStream::State stream_state; QString wave_name; @@ -130,6 +130,7 @@ class RDHPIPlayStream : public QObject,public RDWaveFile bool restart_transport; int samples_pending; unsigned current_position; + uint32_t dma_buffer_size; }; diff --git a/rdhpi/rdhpirecordstream.cpp b/rdhpi/rdhpirecordstream.cpp index d906f774..61647cf6 100644 --- a/rdhpi/rdhpirecordstream.cpp +++ b/rdhpi/rdhpirecordstream.cpp @@ -2,7 +2,7 @@ // // A class for recording Microsoft WAV files. // -// (C) Copyright 2002-2016 Fred Gleason +// (C) Copyright 2002-2018 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -37,6 +37,8 @@ RDHPIRecordStream::RDHPIRecordStream(RDHPISoundCard *card,QWidget *parent) { int quan; uint16_t type[HPI_MAX_ADAPTERS]; + struct hpi_format fmt; + uint32_t dma_size=0; if(getenv(DEBUG_VAR)==NULL) { debug=false; @@ -74,16 +76,28 @@ RDHPIRecordStream::RDHPIRecordStream(RDHPISoundCard *card,QWidget *parent) card_index[i]=i; } #else - LogHpi(HPI_SubSysGetNumAdapters(NULL,&quan)); + LogHpi(HPI_SubSysGetNumAdapters(NULL,&quan),__LINE__); for(int i=0;igetCardInputStreams(card_number);i++) { - if(HPI_InStreamOpen(NULL,card_index[card_number],i,&histream)==0) { + if(LogHpi(HPI_InStreamOpen(NULL,card_index[card_number],i,&histream), + __LINE__)==0) { found=true; break; } @@ -195,6 +210,12 @@ bool RDHPIRecordStream::formatSupported(RDWaveFile::Format format) if(!found) { return false; } + if(LogHpi(HPI_InStreamHostBufferAllocate(NULL,histream,dma_buffer_size), + __LINE__)!=0) { + LogHpi(HPI_InStreamHostBufferFree(NULL,histream),__LINE__); + LogHpi(HPI_InStreamClose(NULL,histream),__LINE__); + return false; + } } else { histream=hpi_stream; @@ -203,40 +224,46 @@ bool RDHPIRecordStream::formatSupported(RDWaveFile::Format format) case RDWaveFile::Pcm8: LogHpi(HPI_FormatCreate(&hformat,getChannels(), HPI_FORMAT_PCM8_UNSIGNED, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_InStreamQueryFormat(NULL,histream,&hformat); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); break; case RDWaveFile::Pcm16: LogHpi(HPI_FormatCreate(&hformat,getChannels(), HPI_FORMAT_PCM16_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_InStreamQueryFormat(NULL,histream,&hformat); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); break; case RDWaveFile::Pcm24: LogHpi(HPI_FormatCreate(&hformat,getChannels(), HPI_FORMAT_PCM24_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_InStreamQueryFormat(NULL,histream,&hformat); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); break; case RDWaveFile::MpegL1: LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L1, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_InStreamQueryFormat(NULL,histream,&hformat); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); break; case RDWaveFile::MpegL2: LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L2, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_InStreamQueryFormat(NULL,histream,&hformat); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); break; case RDWaveFile::MpegL3: LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L3, - getSamplesPerSec(),getHeadBitRate(),0)); - state=HPI_InStreamQueryFormat(NULL,histream,&hformat); + getSamplesPerSec(),getHeadBitRate(),0), + __LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); break; default: @@ -244,7 +271,8 @@ bool RDHPIRecordStream::formatSupported(RDWaveFile::Format format) break; } if(!is_open) { - LogHpi(HPI_InStreamClose(NULL,histream)); + LogHpi(HPI_InStreamHostBufferFree(NULL,histream),__LINE__); + LogHpi(HPI_InStreamClose(NULL,histream),__LINE__); } if(state!=0) { return false; @@ -381,9 +409,9 @@ bool RDHPIRecordStream::recordReady() } if((!is_recording)&&(!is_paused)) { resetWave(); - if(HPI_InStreamGetInfoEx(NULL,hpi_stream, - &state,&buffer_size,&data_recorded, - &samples_recorded,&reserved)!=0) { + if(LogHpi(HPI_InStreamGetInfoEx(NULL,hpi_stream, + &state,&buffer_size,&data_recorded, + &samples_recorded,&reserved),__LINE__)!=0) { if(debug) { printf("RDHPIRecordStream: HPI_InStreamGetInfoEx() failed\n"); } @@ -412,27 +440,27 @@ bool RDHPIRecordStream::recordReady() } switch(getBitsPerSample()) { case 8: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM8_UNSIGNED,getSamplesPerSec(), - 0,0); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM8_UNSIGNED, + getSamplesPerSec(),0,0),__LINE__); break; case 16: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM16_SIGNED,getSamplesPerSec(), - 0,0); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM16_SIGNED, + getSamplesPerSec(),0,0),__LINE__); break; case 24: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM24_SIGNED,getSamplesPerSec(), - 0,0); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM24_SIGNED, + getSamplesPerSec(),0,0),__LINE__); break; case 32: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM32_SIGNED,getSamplesPerSec(), - 0,0); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM32_SIGNED, + getSamplesPerSec(),0,0),__LINE__); break; default: @@ -449,25 +477,29 @@ bool RDHPIRecordStream::recordReady() } switch(getHeadLayer()) { case 1: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L1,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_MPEG_L1,getSamplesPerSec(), + getHeadBitRate(),getHeadFlags()), + __LINE__); break; case 2: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L2,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_MPEG_L2,getSamplesPerSec(), + getHeadBitRate(),getHeadFlags()), + __LINE__); break; case 3: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L3,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_MPEG_L3,getSamplesPerSec(), + getHeadBitRate(),getHeadFlags()), + __LINE__); break; default: - hpi_error=HPI_AdapterClose(NULL,card_index[card_number]); + hpi_error=LogHpi(HPI_AdapterClose(NULL,card_index[card_number]), + __LINE__); if(debug) { printf("RDHPIRecordStream: invalid MPEG-1 layer\n"); } @@ -495,9 +527,9 @@ bool RDHPIRecordStream::recordReady() if(debug) { printf("RDHPIRecordStream: using OggVorbis\n"); } - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM16_SIGNED,getSamplesPerSec(), - 0,0); + hpi_error=LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM16_SIGNED, + getSamplesPerSec(),0,0),__LINE__); break; default: @@ -507,8 +539,8 @@ bool RDHPIRecordStream::recordReady() return false; break; } - if((hpi_error=HPI_InStreamQueryFormat(NULL,hpi_stream, - &format))!=0) { + if((hpi_error=LogHpi(HPI_InStreamQueryFormat(NULL,hpi_stream, + &format),__LINE__))!=0) { if(debug) { HPI_GetErrorText(hpi_error,hpi_text); printf("Num: %d\n",hpi_error); @@ -518,12 +550,12 @@ bool RDHPIRecordStream::recordReady() } } #if HPI_VER < 0x00030500 - HPI_DataCreate(&hpi_data,&format,pdata,fragment_size); + LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,fragment_size),__LINE__); #endif - hpi_error=HPI_InStreamSetFormat(NULL,hpi_stream,&format); - hpi_error=HPI_InStreamStart(NULL,hpi_stream); + hpi_error=LogHpi(HPI_InStreamSetFormat(NULL,hpi_stream,&format),__LINE__); + hpi_error=LogHpi(HPI_InStreamStart(NULL,hpi_stream),__LINE__); // clock->start(2*fragment_time/3); - clock->start(100); + clock->start(RDHPIRECORDSTREAM_CLOCK_INTERVAL); is_ready=true; is_recording=false; is_paused=false; @@ -553,8 +585,8 @@ void RDHPIRecordStream::record() recordReady(); } record_started=false; - LogHpi(HPI_InStreamReset(NULL,hpi_stream)); - LogHpi(HPI_InStreamStart(NULL,hpi_stream)); + LogHpi(HPI_InStreamReset(NULL,hpi_stream),__LINE__); + LogHpi(HPI_InStreamStart(NULL,hpi_stream),__LINE__); is_recording=true; is_paused=false; emit isStopped(false); @@ -577,13 +609,14 @@ void RDHPIRecordStream::pause() if(!is_recording) { return; } - LogHpi(HPI_InStreamStop(NULL,hpi_stream)); + LogHpi(HPI_InStreamStop(NULL,hpi_stream),__LINE__); tickClock(); LogHpi(HPI_InStreamGetInfoEx(NULL,hpi_stream,&state,&buffer_size, - &data_recorded,&samples_recorded,&reserved)); + &data_recorded,&samples_recorded,&reserved), + __LINE__); is_recording=false; is_paused=true; - LogHpi(HPI_InStreamStart(NULL,hpi_stream)); + LogHpi(HPI_InStreamStart(NULL,hpi_stream),__LINE__); emit paused(); emit stateChanged(card_number,stream_number,2); // Paused if(debug) { @@ -599,7 +632,7 @@ void RDHPIRecordStream::stop() printf("RDHPIRecordStream: received stop()\n"); } if(is_ready|is_recording|is_paused) { - LogHpi(HPI_InStreamStop(NULL,hpi_stream)); + LogHpi(HPI_InStreamStop(NULL,hpi_stream),__LINE__); tickClock(); clock->stop(); is_recording=false; @@ -639,7 +672,7 @@ void RDHPIRecordStream::tickClock() { LogHpi(HPI_InStreamGetInfoEx(NULL,hpi_stream, &state,&buffer_size,&data_recorded, - &samples_recorded,&reserved)); + &samples_recorded,&reserved),__LINE__); if((!record_started)&&(is_recording)) { if(samples_recorded>0) { if(record_length>0) { @@ -656,22 +689,23 @@ void RDHPIRecordStream::tickClock() } while(data_recorded>fragment_size) { #if HPI_VER > 0x00030500 - LogHpi(HPI_InStreamReadBuf(NULL,hpi_stream,pdata,fragment_size)); + LogHpi(HPI_InStreamReadBuf(NULL,hpi_stream,pdata,fragment_size),__LINE__); #else - LogHpi(HPI_InStreamRead(NULL,hpi_stream,&hpi_data)); + LogHpi(HPI_InStreamRead(NULL,hpi_stream,&hpi_data),__LINE__); #endif if(is_recording) { writeWave(pdata,fragment_size); } LogHpi(HPI_InStreamGetInfoEx(NULL,hpi_stream,&state,&buffer_size, - &data_recorded,&samples_recorded,&reserved)); + &data_recorded,&samples_recorded,&reserved), + __LINE__); } if(state==HPI_STATE_STOPPED) { #if HPI_VER > 0x00030500 - LogHpi(HPI_InStreamReadBuf(NULL,hpi_stream,pdata,data_recorded)); + LogHpi(HPI_InStreamReadBuf(NULL,hpi_stream,pdata,data_recorded),__LINE__); #else - LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,data_recorded)); - LogHpi(HPI_InStreamRead(NULL,hpi_stream,&hpi_data)); + LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,data_recorded),__LINE__); + LogHpi(HPI_InStreamRead(NULL,hpi_stream,&hpi_data),__LINE__); #endif if(is_recording) { writeWave(pdata,data_recorded); @@ -691,30 +725,38 @@ bool RDHPIRecordStream::GetStream() char hpi_text[100]; if((hpi_err= - HPI_InStreamOpen(NULL,card_index[card_number],stream_number,&hpi_stream))!=0) { + LogHpi(HPI_InStreamOpen(NULL,card_index[card_number],stream_number, + &hpi_stream),__LINE__))!=0) { if(debug) { HPI_GetErrorText(hpi_err,hpi_text); fprintf(stderr,"*** HPI Error: %s ***\n",hpi_text); } return false; } + if(LogHpi(HPI_InStreamHostBufferAllocate(NULL,hpi_stream,dma_buffer_size), + __LINE__)!=0) { + LogHpi(HPI_InStreamHostBufferFree(NULL,hpi_stream),__LINE__); + LogHpi(HPI_InStreamClose(NULL,hpi_stream),__LINE__); + return false; + } return true; } void RDHPIRecordStream::FreeStream() { - LogHpi(HPI_InStreamClose(NULL,hpi_stream)); + LogHpi(HPI_InStreamHostBufferFree(NULL,hpi_stream),__LINE__); + LogHpi(HPI_InStreamClose(NULL,hpi_stream),__LINE__); } -hpi_err_t RDHPIRecordStream::LogHpi(hpi_err_t err) +hpi_err_t RDHPIRecordStream::LogHpi(hpi_err_t err,int lineno) { char err_txt[200]; if(err!=0) { HPI_GetErrorText(err,err_txt); - syslog(LOG_NOTICE,"HPI Error: %s",err_txt); + syslog(LOG_NOTICE,"HPI Error: %s, %s line %d",err_txt,__FILE__,lineno); } return err; } diff --git a/rdhpi/rdhpirecordstream.h b/rdhpi/rdhpirecordstream.h index 4d158277..0c5efa33 100644 --- a/rdhpi/rdhpirecordstream.h +++ b/rdhpi/rdhpirecordstream.h @@ -44,7 +44,6 @@ #define AUDIO_SIZE 32768 #define RDHPIRECORDSTREAM_CLOCK_INTERVAL 100 - class RDHPIRecordStream : public QObject,public RDWaveFile { Q_OBJECT @@ -94,7 +93,7 @@ class RDHPIRecordStream : public QObject,public RDWaveFile private: bool GetStream(); void FreeStream(); - hpi_err_t LogHpi(hpi_err_t err); + hpi_err_t LogHpi(hpi_err_t err,int lineno); RDHPISoundCard *sound_card; bool debug; bool xrun; @@ -130,6 +129,7 @@ class RDHPIRecordStream : public QObject,public RDWaveFile HPI_DATA hpi_data; #endif bool is_open; + uint32_t dma_buffer_size; }; diff --git a/rdhpi/rdhpisoundcard.cpp b/rdhpi/rdhpisoundcard.cpp index c0c6de31..e0335992 100644 --- a/rdhpi/rdhpisoundcard.cpp +++ b/rdhpi/rdhpisoundcard.cpp @@ -170,14 +170,15 @@ bool RDHPISoundCard::setClockSource(int card,RDHPISoundCard::ClockSource src) break; case RDHPISoundCard::AesEbu: case RDHPISoundCard::SpDiff: - hpi_err=HPI_SampleClock_SetSource(NULL, - clock_source_control[card], - HPI_SAMPLECLOCK_SOURCE_AESEBU_SYNC); + hpi_err=LogHpi(HPI_SampleClock_SetSource(NULL, + clock_source_control[card], + HPI_SAMPLECLOCK_SOURCE_AESEBU_SYNC),__LINE__); break; case RDHPISoundCard::WordClock: - hpi_err=HPI_SampleClock_SetSource(NULL, - clock_source_control[card], - HPI_SAMPLECLOCK_SOURCE_WORD); + hpi_err=LogHpi(HPI_SampleClock_SetSource(NULL, + clock_source_control[card], + HPI_SAMPLECLOCK_SOURCE_WORD), + __LINE__); break; } return hpi_err==0; @@ -226,7 +227,7 @@ RDHPISoundCard::SourceNode RDHPISoundCard::getInputPortMux(int card,int port) uint16_t index; LogHpi(HPI_Multiplexer_GetSource(NULL,input_mux_control[card][port], - &type,&index)); + &type,&index),__LINE__); return (RDHPISoundCard::SourceNode)type; } @@ -236,15 +237,15 @@ bool RDHPISoundCard::setInputPortMux(int card,int port,RDHPISoundCard::SourceNod switch(node) { case RDHPISoundCard::LineIn: if(HPI_Multiplexer_SetSource(NULL, - input_mux_control[card][port], - node,0)!=0) { + input_mux_control[card][port],node,0)!=0) { return false; } break; case RDHPISoundCard::AesEbuIn: - if(HPI_Multiplexer_SetSource(NULL, - input_mux_control[card][port],node, - input_mux_index[card][port][1])!=0) { + if(LogHpi(HPI_Multiplexer_SetSource(NULL, + input_mux_control[card][port],node, + input_mux_index[card][port][1]), + __LINE__)!=0) { return false; } break; @@ -263,7 +264,7 @@ unsigned short RDHPISoundCard::getInputPortError(int card,int port) if(input_port_aesebu[card][port]) { LogHpi(HPI_AESEBU_Receiver_GetErrorStatus(NULL, input_port_aesebu_control[card][port], - &error_word)); + &error_word),__LINE__); } return error_word; } @@ -366,7 +367,8 @@ bool RDHPISoundCard::inputStreamMeter(int card,int stream,short *level) return false; } LogHpi(HPI_MeterGetPeak(NULL, - input_stream_meter_control[card][stream],level)); + input_stream_meter_control[card][stream],level), + __LINE__); return true; } @@ -379,8 +381,8 @@ bool RDHPISoundCard::outputStreamMeter(int card,int stream,short *level) if(stream>=card_output_streams[card]) { return false; } - LogHpi(HPI_MeterGetPeak(NULL, - output_stream_meter_control[card][stream],level)); + LogHpi(HPI_MeterGetPeak(NULL,output_stream_meter_control[card][stream], + level),__LINE__); return true; } @@ -393,8 +395,8 @@ bool RDHPISoundCard::inputPortMeter(int card,int port,short *level) if(port>=card_input_ports[card]) { return false; } - LogHpi(HPI_MeterGetPeak(NULL, - input_port_meter_control[card][port],level)); + LogHpi(HPI_MeterGetPeak(NULL,input_port_meter_control[card][port],level), + __LINE__); return true; } @@ -407,7 +409,8 @@ bool RDHPISoundCard::outputPortMeter(int card,int port,short *level) if(port>=card_output_ports[card]) { return false; } - LogHpi(HPI_MeterGetPeak(NULL,output_port_meter_control[card][port],level)); + LogHpi(HPI_MeterGetPeak(NULL,output_port_meter_control[card][port],level), + __LINE__); return true; } @@ -456,8 +459,8 @@ int RDHPISoundCard::getInputVolume(int card,int stream,int port) { short gain[2]; - LogHpi(HPI_VolumeGetGain(NULL, - input_stream_volume_control[card][stream][port],gain)); + LogHpi(HPI_VolumeGetGain(NULL,input_stream_volume_control[card][stream][port], + gain),__LINE__); return gain[0]; } @@ -466,8 +469,7 @@ int RDHPISoundCard::getOutputVolume(int card,int stream,int port) { short gain[2]; - LogHpi(HPI_VolumeGetGain(NULL, - output_stream_volume_control[card][stream][port],gain)); + LogHpi(HPI_VolumeGetGain(NULL,output_stream_volume_control[card][stream][port],gain),__LINE__); return gain[0]; } @@ -476,7 +478,8 @@ int RDHPISoundCard::getInputLevel(int card,int port) { short gain[2]; - LogHpi(HPI_VolumeGetGain(NULL,input_port_level_control[card][port],gain)); + LogHpi(HPI_VolumeGetGain(NULL,input_port_level_control[card][port],gain), + __LINE__); return gain[0]; } @@ -485,7 +488,8 @@ int RDHPISoundCard::getOutputLevel(int card,int port) { short gain[2]; - LogHpi(HPI_VolumeGetGain(NULL,output_port_level_control[card][port],gain)); + LogHpi(HPI_VolumeGetGain(NULL,output_port_level_control[card][port],gain), + __LINE__); return gain[0]; } @@ -499,8 +503,8 @@ void RDHPISoundCard::setInputVolume(int card,int stream,int level) short gain[2]; gain[0]=level; gain[1]=level; - LogHpi(HPI_VolumeSetGain(NULL, - input_stream_volume_control[card][stream][0],gain)); + LogHpi(HPI_VolumeSetGain(NULL,input_stream_volume_control[card][stream][0], + gain),__LINE__); } @@ -514,7 +518,7 @@ void RDHPISoundCard::setOutputVolume(int card,int stream,int port,int level) gain[1]=level; LogHpi(HPI_VolumeSetGain(NULL, output_stream_volume_control[card][stream][port], - gain)); + gain),__LINE__); } @@ -531,7 +535,7 @@ void RDHPISoundCard::fadeOutputVolume(int card,int stream,int port, gain[1]=level; LogHpi(HPI_VolumeAutoFadeProfile(NULL, output_stream_volume_control[card][stream][port], - gain,length,hpi_fade_type)); + gain,length,hpi_fade_type),__LINE__); } @@ -545,7 +549,8 @@ void RDHPISoundCard::setInputLevel(int card,int port,int level) for(unsigned i=0;i>13)&7); hpi_info[i].setDspMinorVersion((dummy_version>>7)&63); hpi_info[i].setPcbVersion((char)(((dummy_version>>3)&7)+'A')); hpi_info[i].setAssemblyVersion(dummy_version&7); - LogHpi(HPI_AdapterClose(NULL,card_index[i])); + LogHpi(HPI_AdapterClose(NULL,card_index[i]),__LINE__); str=QString(tr("Input Stream")); for(int j=0;j Date: Sun, 18 Mar 2018 10:56:34 -0400 Subject: [PATCH 2/9] 2018-03-18 Fred Gleason * Updated switch() statement formatting in 'rdhpi/'. --- ChangeLog | 2 + rdhpi/rdhpiplaystream.cpp | 333 ++++++++++++++++++------------------ rdhpi/rdhpirecordstream.cpp | 171 +++++++++--------- rdhpi/rdhpisoundcard.cpp | 136 ++++++++------- 4 files changed, 317 insertions(+), 325 deletions(-) diff --git a/ChangeLog b/ChangeLog index 817ce800..d228c982 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16612,3 +16612,5 @@ * Incremented the package version to 2.19.0. 2018-03-17 Fred Gleason * Added support for DMA bus-mastering to the HPI driver. +2018-03-18 Fred Gleason + * Updated switch() statement formatting in 'rdhpi/'. diff --git a/rdhpi/rdhpiplaystream.cpp b/rdhpi/rdhpiplaystream.cpp index 929327a3..38cd71b8 100644 --- a/rdhpi/rdhpiplaystream.cpp +++ b/rdhpi/rdhpiplaystream.cpp @@ -141,26 +141,26 @@ QString RDHPIPlayStream::errorString(RDHPIPlayStream::Error err) QString str; switch(err) { - case RDHPIPlayStream::Ok: - return QString(tr("Ok")); - break; + case RDHPIPlayStream::Ok: + return QString(tr("Ok")); + break; - case RDHPIPlayStream::NoFile: - return QString(tr("No such file or directory")); - break; + case RDHPIPlayStream::NoFile: + return QString(tr("No such file or directory")); + break; - case RDHPIPlayStream::NoStream: - return QString(tr("No output stream available")); - break; + case RDHPIPlayStream::NoStream: + return QString(tr("No output stream available")); + break; - case RDHPIPlayStream::AlreadyOpen: - return QString(tr("Stream is already open")); - break; + case RDHPIPlayStream::AlreadyOpen: + return QString(tr("Stream is already open")); + break; - default: - str=QString(tr("Unknown Error:")); - return QString().sprintf("%s %d\n",(const char *)str,err); - break; + default: + str=QString(tr("Unknown Error:")); + return QString().sprintf("%s %d\n",(const char *)str,err); + break; } } @@ -206,54 +206,44 @@ bool RDHPIPlayStream::formatSupported(RDWaveFile::Format format) hostream=hpi_stream; } switch(format) { - case RDWaveFile::Pcm16: - LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), - HPI_FORMAT_PCM16_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), - __LINE__); - break; + case RDWaveFile::Pcm16: + LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), + HPI_FORMAT_PCM16_SIGNED, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format),__LINE__); + break; - case RDWaveFile::Pcm24: - LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), - HPI_FORMAT_PCM24_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), - __LINE__); - break; + case RDWaveFile::Pcm24: + LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), + HPI_FORMAT_PCM24_SIGNED, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format),__LINE__); + break; - case RDWaveFile::MpegL1: - LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), - HPI_FORMAT_MPEG_L1, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), - __LINE__); - break; + case RDWaveFile::MpegL1: + LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), + HPI_FORMAT_MPEG_L1, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format),__LINE__); + break; - case RDWaveFile::MpegL2: - LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), - HPI_FORMAT_MPEG_L2, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), - __LINE__); - break;; + case RDWaveFile::MpegL2: + LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), + HPI_FORMAT_MPEG_L2, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format),__LINE__); + break; - case RDWaveFile::MpegL3: - LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), - HPI_FORMAT_MPEG_L3, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format), - __LINE__); - break; + case RDWaveFile::MpegL3: + LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), + HPI_FORMAT_MPEG_L3, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format),__LINE__); + break; - default: - state=1; - break; + default: + state=1; + break; } if(!is_open) { LogHpi(HPI_OutStreamHostBufferFree(NULL,hostream),__LINE__); @@ -269,46 +259,46 @@ bool RDHPIPlayStream::formatSupported(RDWaveFile::Format format) bool RDHPIPlayStream::formatSupported() { switch(getFormatTag()) { - case WAVE_FORMAT_PCM: - switch(getBitsPerSample()) { - case 8: - return formatSupported(RDWaveFile::Pcm8); - break; + case WAVE_FORMAT_PCM: + switch(getBitsPerSample()) { + case 8: + return formatSupported(RDWaveFile::Pcm8); + break; - case 16: - return formatSupported(RDWaveFile::Pcm16); - break; + case 16: + return formatSupported(RDWaveFile::Pcm16); + break; - case 24: - return formatSupported(RDWaveFile::Pcm24); - break; + case 24: + return formatSupported(RDWaveFile::Pcm24); + break; - default: - return false; - } - break; + default: + return false; + } + break; - case WAVE_FORMAT_MPEG: - switch(getHeadLayer()) { - case 1: - return formatSupported(RDWaveFile::MpegL1); - break; + case WAVE_FORMAT_MPEG: + switch(getHeadLayer()) { + case 1: + return formatSupported(RDWaveFile::MpegL1); + break; - case 2: - return formatSupported(RDWaveFile::MpegL2); - break; + case 2: + return formatSupported(RDWaveFile::MpegL2); + break; - case 3: - return formatSupported(RDWaveFile::MpegL3); - break; + case 3: + return formatSupported(RDWaveFile::MpegL3); + break; - default: - return false; - } - break; + default: + return false; + } + break; - default: - return false; + default: + return false; } } @@ -447,62 +437,62 @@ bool RDHPIPlayStream::play() return false; } switch(getFormatTag()) { - case WAVE_FORMAT_PCM: - case WAVE_FORMAT_VORBIS: - switch(getBitsPerSample()) { - case 8: - LogHpi(HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM8_UNSIGNED, - getSamplesPerSec(),0,0),__LINE__); - break; - case 16: - LogHpi(HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM16_SIGNED, - getSamplesPerSec(),0,0),__LINE__); - break; - case 24: - LogHpi(HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM24_SIGNED, - getSamplesPerSec(),0,0),__LINE__); - break; - case 32: - LogHpi(HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM32_SIGNED, - getSamplesPerSec(),0,0),__LINE__); - break; - default: - LogHpi(HPI_AdapterClose(NULL,card_index[card_number]),__LINE__); - return false; - break; - } - break; - case WAVE_FORMAT_MPEG: - switch(getHeadLayer()) { - case 1: - LogHpi(HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L1,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()), - __LINE__); - break; - case 2: - LogHpi(HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L2,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()), - __LINE__); - break; - case 3: - LogHpi(HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L3,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()), - __LINE__); - break; - default: - LogHpi(HPI_AdapterClose(NULL,card_index[card_number]),__LINE__); - return false; - } - break; - default: - return false; + case WAVE_FORMAT_PCM: + case WAVE_FORMAT_VORBIS: + switch(getBitsPerSample()) { + case 8: + LogHpi(HPI_FormatCreate(&format,getChannels(),HPI_FORMAT_PCM8_UNSIGNED, + getSamplesPerSec(),0,0),__LINE__); + break; + + case 16: + LogHpi(HPI_FormatCreate(&format,getChannels(),HPI_FORMAT_PCM16_SIGNED, + getSamplesPerSec(),0,0),__LINE__); + break; + + case 24: + LogHpi(HPI_FormatCreate(&format,getChannels(),HPI_FORMAT_PCM24_SIGNED, + getSamplesPerSec(),0,0),__LINE__); + break; + + case 32: + LogHpi(HPI_FormatCreate(&format,getChannels(),HPI_FORMAT_PCM32_SIGNED, + getSamplesPerSec(),0,0),__LINE__); + break; + + default: + LogHpi(HPI_AdapterClose(NULL,card_index[card_number]),__LINE__); + return false; + } + break; + case WAVE_FORMAT_MPEG: + switch(getHeadLayer()) { + case 1: + LogHpi(HPI_FormatCreate(&format,getChannels(),HPI_FORMAT_MPEG_L1, + getSamplesPerSec(),getHeadBitRate(), + getHeadFlags()),__LINE__); + break; + + case 2: + LogHpi(HPI_FormatCreate(&format,getChannels(),HPI_FORMAT_MPEG_L2, + getSamplesPerSec(),getHeadBitRate(), + getHeadFlags()),__LINE__); + break; + + case 3: + LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_MPEG_L3,getSamplesPerSec(), + getHeadBitRate(),getHeadFlags()),__LINE__); + break; + + default: + LogHpi(HPI_AdapterClose(NULL,card_index[card_number]),__LINE__); + return false; + } + break; + + default: + return false; } #if HPI_VER < 0x00030500 if(LogHpi(HPI_DataCreate(&hpi_data,&format,pdata,fragment_size),__LINE__)!= @@ -586,14 +576,14 @@ void RDHPIPlayStream::pause() &data_to_play,&samples_played,&reserved), __LINE__); switch(getFormatTag()) { - case WAVE_FORMAT_PCM: - samples_pending=data_to_play/(getChannels()*getBitsPerSample()/8); - break; + case WAVE_FORMAT_PCM: + samples_pending=data_to_play/(getChannels()*getBitsPerSample()/8); + break; - case WAVE_FORMAT_MPEG: - samples_pending= - 1152*data_to_play/(144*getHeadBitRate()/getSamplesPerSec()); - break; + case WAVE_FORMAT_MPEG: + samples_pending= + 1152*data_to_play/(144*getHeadBitRate()/getSamplesPerSec()); + break; } playing=false; is_paused=true; @@ -673,23 +663,24 @@ bool RDHPIPlayStream::setPosition(unsigned samples) LogHpi(HPI_OutStreamReset(NULL,hpi_stream),__LINE__); samples_played=0; switch(getFormatTag()) { - case WAVE_FORMAT_PCM: - case WAVE_FORMAT_VORBIS: - samples_skipped= - (unsigned)((double)getBlockAlign()* - ((double)samples/(double)getBlockAlign())); - seekWave((int)((double)samples_skipped*(double)getBlockAlign()), - SEEK_SET); - break; - case WAVE_FORMAT_MPEG: - samples_skipped= - (unsigned)((double)getBlockAlign()* - ((double)samples/(double)getBlockAlign())); - seekWave((int)((double)(getAvgBytesPerSec())* - ((double)(samples_skipped)/ - ((double)getSamplesPerSec()))), - SEEK_SET); - break; + case WAVE_FORMAT_PCM: + case WAVE_FORMAT_VORBIS: + samples_skipped= + (unsigned)((double)getBlockAlign()* + ((double)samples/(double)getBlockAlign())); + seekWave((int)((double)samples_skipped*(double)getBlockAlign()), + SEEK_SET); + break; + + case WAVE_FORMAT_MPEG: + samples_skipped= + (unsigned)((double)getBlockAlign()* + ((double)samples/(double)getBlockAlign())); + seekWave((int)((double)(getAvgBytesPerSec())* + ((double)(samples_skipped)/ + ((double)getSamplesPerSec()))), + SEEK_SET); + break; } emit position(samples); } diff --git a/rdhpi/rdhpirecordstream.cpp b/rdhpi/rdhpirecordstream.cpp index 61647cf6..2b821775 100644 --- a/rdhpi/rdhpirecordstream.cpp +++ b/rdhpi/rdhpirecordstream.cpp @@ -115,26 +115,26 @@ QString RDHPIRecordStream::errorString(RDHPIRecordStream::Error err) QString str; switch(err) { - case RDHPIRecordStream::Ok: - return QString(tr("Ok")); - break; + case RDHPIRecordStream::Ok: + return QString(tr("Ok")); + break; - case RDHPIRecordStream::NoFile: - return QString(tr("Unable to create/open file")); - break; + case RDHPIRecordStream::NoFile: + return QString(tr("Unable to create/open file")); + break; - case RDHPIRecordStream::NoStream: - return QString(tr("Input stream unavailable")); - break; + case RDHPIRecordStream::NoStream: + return QString(tr("Input stream unavailable")); + break; - case RDHPIRecordStream::AlreadyOpen: - return QString(tr("Stream is already open")); - break; + case RDHPIRecordStream::AlreadyOpen: + return QString(tr("Stream is already open")); + break; - default: - str=QString(tr("Unknown Error:")); - return QString().sprintf("%s %d\n",(const char *)str,err); - break; + default: + str=QString(tr("Unknown Error:")); + return QString().sprintf("%s %d\n",(const char *)str,err); + break; } } @@ -221,54 +221,45 @@ bool RDHPIRecordStream::formatSupported(RDWaveFile::Format format) histream=hpi_stream; } switch(format) { - case RDWaveFile::Pcm8: - LogHpi(HPI_FormatCreate(&hformat,getChannels(), - HPI_FORMAT_PCM8_UNSIGNED, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); - break; + case RDWaveFile::Pcm8: + LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_PCM8_UNSIGNED, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); + break; - case RDWaveFile::Pcm16: - LogHpi(HPI_FormatCreate(&hformat,getChannels(), - HPI_FORMAT_PCM16_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); - break; + case RDWaveFile::Pcm16: + LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_PCM16_SIGNED, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); + break; - case RDWaveFile::Pcm24: - LogHpi(HPI_FormatCreate(&hformat,getChannels(), - HPI_FORMAT_PCM24_SIGNED, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); - break; + case RDWaveFile::Pcm24: + LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_PCM24_SIGNED, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); + break; - case RDWaveFile::MpegL1: - LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L1, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); - break; + case RDWaveFile::MpegL1: + LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L1, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); + break; - case RDWaveFile::MpegL2: - LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L2, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); - break; + case RDWaveFile::MpegL2: + LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L2, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); + break; - case RDWaveFile::MpegL3: - LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L3, - getSamplesPerSec(),getHeadBitRate(),0), - __LINE__); - state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); - break; + case RDWaveFile::MpegL3: + LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L3, + getSamplesPerSec(),getHeadBitRate(),0),__LINE__); + state=LogHpi(HPI_InStreamQueryFormat(NULL,histream,&hformat),__LINE__); + break; - default: - state=1; - break; + default: + state=1; + break; } if(!is_open) { LogHpi(HPI_InStreamHostBufferFree(NULL,histream),__LINE__); @@ -284,46 +275,46 @@ bool RDHPIRecordStream::formatSupported(RDWaveFile::Format format) bool RDHPIRecordStream::formatSupported() { switch(getFormatTag()) { - case WAVE_FORMAT_PCM: - switch(getBitsPerSample()) { - case 8: - return formatSupported(RDWaveFile::Pcm8); - break; + case WAVE_FORMAT_PCM: + switch(getBitsPerSample()) { + case 8: + return formatSupported(RDWaveFile::Pcm8); + break; - case 16: - return formatSupported(RDWaveFile::Pcm16); - break; + case 16: + return formatSupported(RDWaveFile::Pcm16); + break; - case 24: - return formatSupported(RDWaveFile::Pcm24); - break; + case 24: + return formatSupported(RDWaveFile::Pcm24); + break; - default: - return false; - } - break; + default: + return false; + } + break; - case WAVE_FORMAT_MPEG: - switch(getHeadLayer()) { - case 1: - return formatSupported(RDWaveFile::MpegL1); - break; + case WAVE_FORMAT_MPEG: + switch(getHeadLayer()) { + case 1: + return formatSupported(RDWaveFile::MpegL1); + break; - case 2: - return formatSupported(RDWaveFile::MpegL2); - break; + case 2: + return formatSupported(RDWaveFile::MpegL2); + break; - case 3: - return formatSupported(RDWaveFile::MpegL3); - break; + case 3: + return formatSupported(RDWaveFile::MpegL3); + break; - default: - return false; - } - break; + default: + return false; + } + break; - default: - return false; + default: + return false; } } diff --git a/rdhpi/rdhpisoundcard.cpp b/rdhpi/rdhpisoundcard.cpp index e0335992..90caf4ae 100644 --- a/rdhpi/rdhpisoundcard.cpp +++ b/rdhpi/rdhpisoundcard.cpp @@ -163,23 +163,25 @@ bool RDHPISoundCard::setClockSource(int card,RDHPISoundCard::ClockSource src) hpi_err_t hpi_err=0; switch(src) { - case RDHPISoundCard::Internal: - hpi_err=HPI_SampleClock_SetSource(NULL, - clock_source_control[card], - HPI_SAMPLECLOCK_SOURCE_LOCAL); - break; - case RDHPISoundCard::AesEbu: - case RDHPISoundCard::SpDiff: - hpi_err=LogHpi(HPI_SampleClock_SetSource(NULL, - clock_source_control[card], - HPI_SAMPLECLOCK_SOURCE_AESEBU_SYNC),__LINE__); - break; - case RDHPISoundCard::WordClock: - hpi_err=LogHpi(HPI_SampleClock_SetSource(NULL, - clock_source_control[card], - HPI_SAMPLECLOCK_SOURCE_WORD), - __LINE__); - break; + case RDHPISoundCard::Internal: + hpi_err=HPI_SampleClock_SetSource(NULL, + clock_source_control[card], + HPI_SAMPLECLOCK_SOURCE_LOCAL); + break; + + case RDHPISoundCard::AesEbu: + case RDHPISoundCard::SpDiff: + hpi_err=LogHpi(HPI_SampleClock_SetSource(NULL, + clock_source_control[card], + HPI_SAMPLECLOCK_SOURCE_AESEBU_SYNC),__LINE__); + break; + + case RDHPISoundCard::WordClock: + hpi_err=LogHpi(HPI_SampleClock_SetSource(NULL, + clock_source_control[card], + HPI_SAMPLECLOCK_SOURCE_WORD), + __LINE__); + break; } return hpi_err==0; } @@ -235,23 +237,25 @@ RDHPISoundCard::SourceNode RDHPISoundCard::getInputPortMux(int card,int port) bool RDHPISoundCard::setInputPortMux(int card,int port,RDHPISoundCard::SourceNode node) { switch(node) { - case RDHPISoundCard::LineIn: - if(HPI_Multiplexer_SetSource(NULL, - input_mux_control[card][port],node,0)!=0) { - return false; - } - break; - case RDHPISoundCard::AesEbuIn: - if(LogHpi(HPI_Multiplexer_SetSource(NULL, - input_mux_control[card][port],node, - input_mux_index[card][port][1]), - __LINE__)!=0) { - return false; - } - break; - default: - return false; - break; + case RDHPISoundCard::LineIn: + if(HPI_Multiplexer_SetSource(NULL, + input_mux_control[card][port],node,0)!=0) { + return false; + } + break; + + case RDHPISoundCard::AesEbuIn: + if(LogHpi(HPI_Multiplexer_SetSource(NULL, + input_mux_control[card][port],node, + input_mux_index[card][port][1]), + __LINE__)!=0) { + return false; + } + break; + + default: + return false; + break; } return true; } @@ -280,12 +284,13 @@ void RDHPISoundCard::setFadeProfile(RDHPISoundCard::FadeProfile profile) { fade_type=profile; switch(fade_type) { - case RDHPISoundCard::Linear: - hpi_fade_type=HPI_VOLUME_AUTOFADE_LINEAR; - break; - case RDHPISoundCard::Log: - hpi_fade_type=HPI_VOLUME_AUTOFADE_LOG; - break; + case RDHPISoundCard::Linear: + hpi_fade_type=HPI_VOLUME_AUTOFADE_LINEAR; + break; + + case RDHPISoundCard::Log: + hpi_fade_type=HPI_VOLUME_AUTOFADE_LOG; + break; } } @@ -436,15 +441,17 @@ bool RDHPISoundCard::haveInputPortMux(int card,int port) const bool RDHPISoundCard::queryInputPortMux(int card,int port,SourceNode node) const { switch(node) { - case RDHPISoundCard::LineIn: - return input_port_mux_type[card][port][0]; - break; - case RDHPISoundCard::AesEbuIn: - return input_port_mux_type[card][port][1]; - break; - default: - return false; - break; + case RDHPISoundCard::LineIn: + return input_port_mux_type[card][port][0]; + break; + + case RDHPISoundCard::AesEbuIn: + return input_port_mux_type[card][port][1]; + break; + + default: + return false; + break; } } @@ -673,14 +680,14 @@ void RDHPISoundCard::HPIProbe() timescale_support[i]=false; } switch(hpi_adapter_list[i]) { - case 0x5111: - case 0x5211: - input_mux_type[i]=true; - break; + case 0x5111: + case 0x5211: + input_mux_type[i]=true; + break; - default: - input_mux_type[i]=false; - break; + default: + input_mux_type[i]=false; + break; } card_input_ports[i]=0; card_output_ports[i]=0; @@ -803,14 +810,15 @@ void RDHPISoundCard::HPIProbe() l++,&type,&index), __LINE__)==0) { switch(type) { - case HPI_SOURCENODE_LINEIN: - input_port_mux_type[i][j][0]=true; - input_mux_index[i][j][0]=index; - break; - case HPI_SOURCENODE_AESEBU_IN: - input_port_mux_type[i][j][1]=true; - input_mux_index[i][j][1]=index; - break; + case HPI_SOURCENODE_LINEIN: + input_port_mux_type[i][j][0]=true; + input_mux_index[i][j][0]=index; + break; + + case HPI_SOURCENODE_AESEBU_IN: + input_port_mux_type[i][j][1]=true; + input_mux_index[i][j][1]=index; + break; } } } From f39e85ec5f60c4dbe5862b40aea4065d9ebbbe46 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Sun, 18 Mar 2018 11:07:01 -0400 Subject: [PATCH 3/9] 2018-03-18 Fred Gleason * Fixed a bug in rdlogmanager(1) that caused DB corruption when a clock was deleted while still being assigned to a grid. --- ChangeLog | 3 +++ rdlogmanager/list_clocks.cpp | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d228c982..53d6147d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16614,3 +16614,6 @@ * Added support for DMA bus-mastering to the HPI driver. 2018-03-18 Fred Gleason * Updated switch() statement formatting in 'rdhpi/'. +2018-03-18 Fred Gleason + * Fixed a bug in rdlogmanager(1) that caused DB corruption when + a clock was deleted while still being assigned to a grid. diff --git a/rdlogmanager/list_clocks.cpp b/rdlogmanager/list_clocks.cpp index eacdf88f..1e568de6 100644 --- a/rdlogmanager/list_clocks.cpp +++ b/rdlogmanager/list_clocks.cpp @@ -609,9 +609,10 @@ void ListClocks::DeleteClock(QString clockname) base_name.replace(" ","_"); // - // Delete Active Clocks + // Clear Active Clocks // - sql=QString("delete from SERVICE_CLOCKS where ")+ + sql=QString("update SERVICE_CLOCKS set ")+ + "CLOCK_NAME=null where "+ "CLOCK_NAME=\""+RDEscapeString(clockname)+"\""; q=new RDSqlQuery(sql); delete q; From 3b4fddd10639d1b8717d6ecde1a02f623bea9cf1 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Mon, 19 Mar 2018 13:38:36 -0400 Subject: [PATCH 4/9] 2018-03-19 Fred Gleason * Incremented the package version to 2.19.0int00. --- ChangeLog | 2 ++ NEWS | 17 +++++++++++++++++ PACKAGE_VERSION | 2 +- rivendell.ism | Bin 499284 -> 499284 bytes 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 53d6147d..29c697cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16617,3 +16617,5 @@ 2018-03-18 Fred Gleason * Fixed a bug in rdlogmanager(1) that caused DB corruption when a clock was deleted while still being assigned to a grid. +2018-03-19 Fred Gleason + * Incremented the package version to 2.19.0int00. diff --git a/NEWS b/NEWS index a251afba..2941e472 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,22 @@ The NEWS file for the Rivendell package. +------------------------------------------------------------------------------- +v2.19.1int00 -- 3/19/2018 + +Changes: + HPI Support. Implemented support for DMA bus-mastering in the AudioScience + HPI driver. + + RDLogManager. Fixed a bug in rdlogmanager(1) that caused DB corruption + when a clock was deleted while still being assigned to a grid. + +Database Update: + This version of Rivendell uses database schema version 275, and will + automatically upgrade any earlier versions. To see the current schema + version prior to upgrade, see RDAdmin->SystemInfo. + + As always, be sure to run RDAdmin immediately after upgrading to allow + any necessary changes to the database schema to be applied. ------------------------------------------------------------------------------- v2.19.0 -- 2/22/2018 diff --git a/PACKAGE_VERSION b/PACKAGE_VERSION index 92aa628b..444ccca6 100644 --- a/PACKAGE_VERSION +++ b/PACKAGE_VERSION @@ -1 +1 @@ -2.19.0 \ No newline at end of file +2.19.0int00 \ No newline at end of file diff --git a/rivendell.ism b/rivendell.ism index e0aafe2401f848130a84075bdb20d38a18142be8..770b0274eee91ac09f0b4b6d2bb4472a523a2f14 100644 GIT binary patch delta 18533 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 W4e}mK%O;{NV!=-BWf6I|R{DQF-dgSe delta 16878 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ⅅ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 z Date: Tue, 20 Mar 2018 10:01:52 -0400 Subject: [PATCH 5/9] 2018-03-20 Fred Gleason * Removed rdhpiinfo(8). --- ChangeLog | 2 + configure.ac | 15 +- utils/Makefile.am | 4 - utils/rdhpiinfo/Makefile.am | 51 --- utils/rdhpiinfo/change_mode.cpp | 194 ----------- utils/rdhpiinfo/change_mode.h | 58 ---- utils/rdhpiinfo/rdhpiinfo.cpp | 481 --------------------------- utils/rdhpiinfo/rdhpiinfo.h | 86 ----- utils/rdhpiinfo/rdhpiinfo.pro | 0 utils/rdhpiinfo/virtdetails.cpp | 200 ----------- utils/rdhpiinfo/virtdetails.h | 66 ---- xdg/Makefile.am | 12 - xdg/rdhpiinfo-root-consolehelper | 3 - xdg/rdhpiinfo-root-pam | 4 - xdg/rivendell-rdhpiinfo-root.desktop | 10 - xdg/rivendell-rdhpiinfo.desktop | 12 - 16 files changed, 7 insertions(+), 1191 deletions(-) delete mode 100644 utils/rdhpiinfo/Makefile.am delete mode 100644 utils/rdhpiinfo/change_mode.cpp delete mode 100644 utils/rdhpiinfo/change_mode.h delete mode 100644 utils/rdhpiinfo/rdhpiinfo.cpp delete mode 100644 utils/rdhpiinfo/rdhpiinfo.h delete mode 100644 utils/rdhpiinfo/rdhpiinfo.pro delete mode 100644 utils/rdhpiinfo/virtdetails.cpp delete mode 100644 utils/rdhpiinfo/virtdetails.h delete mode 100644 xdg/rdhpiinfo-root-consolehelper delete mode 100644 xdg/rdhpiinfo-root-pam delete mode 100644 xdg/rivendell-rdhpiinfo-root.desktop delete mode 100644 xdg/rivendell-rdhpiinfo.desktop diff --git a/ChangeLog b/ChangeLog index 29c697cd..6a9bea71 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16619,3 +16619,5 @@ a clock was deleted while still being assigned to a grid. 2018-03-19 Fred Gleason * Incremented the package version to 2.19.0int00. +2018-03-20 Fred Gleason + * Removed rdhpiinfo(8). diff --git a/configure.ac b/configure.ac index 8a61bcb3..fc76d4b5 100644 --- a/configure.ac +++ b/configure.ac @@ -303,21 +303,17 @@ if test $HPI_FOUND ; then AC_SUBST(HPI_FILE2,$LIB_PATH/librdhpi.a) AC_SUBST(HPI_FILE3,$LIB_PATH/librdhpi.la) AC_SUBST(HPI_FILE4,$LIB_PATH/librdhpi.so) - AC_SUBST(HPI_FILE5,$PREFIX/bin/rdhpiinfo) - if test $ar_gcc_distro = suse ; then - AC_SUBST(HPI_FILE6,"") - else - AC_SUBST(HPI_FILE6,$PREFIX/bin/rdhpiinfo-root) - fi + AC_SUBST(HPI_FILE5,"") + AC_SUBST(HPI_FILE6,"") AC_SUBST(HPI_FILE7,$PREFIX/share/rivendell/rdhpi_es.qm) AC_SUBST(HPI_FILE8,$PREFIX/share/rivendell/rdhpi_cs.qm) AC_SUBST(HPI_FILE9,$PREFIX/share/rivendell/rdhpi_de.qm) AC_SUBST(HPI_FILE10,$PREFIX/share/rivendell/rdhpi_nn.qm) AC_SUBST(HPI_FILE11,$PREFIX/share/rivendell/rdhpi_nb.qm) AC_SUBST(HPI_FILE12,$PREFIX/share/rivendell/rdhpi_pt_BR.qm) - AC_SUBST(HPI_FILE13,$PREFIX/share/applications/rivendell-rdhpiinfo-root.desktop) - AC_SUBST(HPI_FILE14,/etc/pam.d/rdhpiinfo-root) - AC_SUBST(HPI_FILE15,/etc/security/console.apps/rdhpiinfo-root) + AC_SUBST(HPI_FILE13,"") + AC_SUBST(HPI_FILE14,"") + AC_SUBST(HPI_FILE15,"") else AC_SUBST(LIBHPI,"") AC_SUBST(HPI_FILE1,"") @@ -518,7 +514,6 @@ AC_CONFIG_FILES([rivendell.spec \ utils/rdexport/Makefile \ utils/rdgen/Makefile \ utils/rdgpimon/Makefile \ - utils/rdhpiinfo/Makefile \ utils/rdimport/Makefile \ utils/rdmaint/Makefile \ utils/rdmarkerset/Makefile \ diff --git a/utils/Makefile.am b/utils/Makefile.am index 103c3240..54dfbce7 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -20,14 +20,10 @@ ## ## Use automake to process this into a Makefile.in -if HPI_RD_AM - HPIINFO_RD_OPT = rdhpiinfo -endif if ALSA_RD_AM ALSACONFIG_RD_OPT = rdalsaconfig endif SUBDIRS = $(ALSACONFIG_RD_OPT)\ - $(HPIINFO_RD_OPT)\ rddbcheck\ rddgimport\ rdcheckcuts\ diff --git a/utils/rdhpiinfo/Makefile.am b/utils/rdhpiinfo/Makefile.am deleted file mode 100644 index 1cb8e80f..00000000 --- a/utils/rdhpiinfo/Makefile.am +++ /dev/null @@ -1,51 +0,0 @@ -## automake.am -## -## Automake.am for utils/rdhpiinfo -## -## (C) Copyright 2002-2007,2016 Fred Gleason -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License version 2 as -## published by the Free Software Foundation. -## -## 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. -## -## Use automake to process this into a Makefile.in -## - -AM_CPPFLAGS = -Wall -DPREFIX=\"$(prefix)\" -DQTDIR=\"@QT_DIR@\" @QT_CXXFLAGS@ -I$(top_srcdir)/lib -I$(top_srcdir)/rdhpi -LIBS = @QT_LIBS@ -L$(top_srcdir)/lib -L$(top_srcdir)/rdhpi -MOC = @QT_MOC@ - -# The dependency for qt's Meta Object Compiler (moc) -moc_%.cpp: %.h - $(MOC) $< -o $@ - -bin_PROGRAMS = rdhpiinfo - -dist_rdhpiinfo_SOURCES = change_mode.cpp change_mode.h\ - rdhpiinfo.cpp rdhpiinfo.h\ - virtdetails.cpp virtdetails.h - -nodist_rdhpiinfo_SOURCES = moc_change_mode.cpp\ - moc_rdhpiinfo.cpp\ - moc_virtdetails.cpp - -rdhpiinfo_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ @LIBHPI@ - -EXTRA_DIST = rdhpiinfo.pro - -CLEANFILES = *~\ - *.qm\ - moc_* - -MAINTAINERCLEANFILES = *~\ - Makefile.in\ - moc_* diff --git a/utils/rdhpiinfo/change_mode.cpp b/utils/rdhpiinfo/change_mode.cpp deleted file mode 100644 index 84780b67..00000000 --- a/utils/rdhpiinfo/change_mode.cpp +++ /dev/null @@ -1,194 +0,0 @@ -// change_mode.cpp -// -// Change the mode of an AudioScience Adapter. -// -// (C) Copyright 2002-2014,2016 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// 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 - -ChangeMode::ChangeMode(unsigned short card,unsigned short type,int mode, - QWidget *parent) - : QDialog(parent,"",true) -{ - QString str; - - // - // Fix the Window Size - // - setMinimumWidth(sizeHint().width()); - setMaximumWidth(sizeHint().width()); - setMinimumHeight(sizeHint().height()); - setMaximumHeight(sizeHint().height()); - - setCaption(tr("RdHPIInfo - Change Mode")); - - // - // Create Fonts - // - QFont font=QFont("Helvetica",12,QFont::Normal); - font.setPixelSize(12); - QFont label_font=QFont("Helvetica",12,QFont::Bold); - label_font.setPixelSize(12); - - // - // Adapter Type - // - QLabel *label=new QLabel(QString().sprintf("AudioScience %X",type),this); - label->setGeometry(10,10,sizeHint().width()-20,15); - label->setFont(label_font); - label->setAlignment(AlignCenter); - - // - // Adapter Mode - // - change_mode_box=new QComboBox(this); - change_mode_box->setGeometry(10,35,sizeHint().width()-20,22); - change_mode_box->setFont(font); - int index=0; - for(uint32_t i=1;i<14;i++) { - if(HPI_AdapterSetModeEx(NULL,card,i,HPI_ADAPTER_MODE_QUERY)==0) { - switch(i) { - case HPI_ADAPTER_MODE_4OSTREAM: - change_mode_box->insertItem(tr("Four Output Streams")); - break; - - case HPI_ADAPTER_MODE_6OSTREAM: - change_mode_box->insertItem(tr("Six Output Streams")); - break; - - case HPI_ADAPTER_MODE_8OSTREAM: - change_mode_box->insertItem(tr("Eight Output Streams")); - break; - - case HPI_ADAPTER_MODE_12OSTREAM: - change_mode_box->insertItem(tr("Twelve Output Streams")); - break; - - case HPI_ADAPTER_MODE_16OSTREAM: - change_mode_box->insertItem(tr("Sixteen Output Streams")); - break; - - case HPI_ADAPTER_MODE_1OSTREAM: - change_mode_box->insertItem(tr("One Output Stream")); - break; - - case HPI_ADAPTER_MODE_1: - change_mode_box->insertItem(tr("Mode 1")); - break; - - case HPI_ADAPTER_MODE_2: - change_mode_box->insertItem(tr("Mode 2")); - break; - - case HPI_ADAPTER_MODE_3: - change_mode_box->insertItem(tr("Mode 3")); - break; - - case HPI_ADAPTER_MODE_MULTICHANNEL: - change_mode_box->insertItem(tr("Surround Sound [SSX]")); - break; - - case HPI_ADAPTER_MODE_9OSTREAM: - change_mode_box->insertItem(tr("Nine Output Stream")); - break; - - case HPI_ADAPTER_MODE_MONO: - change_mode_box->insertItem(tr("Mono Mode")); - break; - - case HPI_ADAPTER_MODE_LOW_LATENCY: - change_mode_box->insertItem(tr("Low Latency Mode")); - break; - - default: - str=QString(tr("Unknown")); - change_mode_box-> - insertItem(QString().sprintf(" %s [MODE=%u]\n", - (const char *)str,(unsigned)i)); - break; - } - hpi_mode_map[index]=i; - if(mode==(int)i) { - change_mode_box->setCurrentItem(index); - change_index=index; - } - index++; - } - } - - // - // Ok Button - // - QPushButton *ok_button=new QPushButton(this); - ok_button->setGeometry(sizeHint().width()-140,sizeHint().height()-40,60,30); - ok_button->setDefault(true); - ok_button->setFont(font); - ok_button->setText(tr("&OK")); - connect(ok_button,SIGNAL(clicked()),this,SLOT(okData())); - - // - // Cancel Button - // - QPushButton *cancel_button=new QPushButton(this); - cancel_button->setGeometry(sizeHint().width()-70,sizeHint().height()-40, - 60,30); - cancel_button->setFont(font); - cancel_button->setText(tr("&Cancel")); - connect(cancel_button,SIGNAL(clicked()),this,SLOT(cancelData())); -} - - -QSize ChangeMode::sizeHint() const -{ - return QSize(280,110); -} - - -QSizePolicy ChangeMode::sizePolicy() const -{ - return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); -} - - -void ChangeMode::closeEvent(QCloseEvent *e) -{ - cancelData(); -} - - -void ChangeMode::okData() -{ - if(change_mode_box->currentItem()==change_index) { - done(-1); - return; - } - if(QMessageBox::warning(this,"RDHPIInfo",tr("The HPI driver will need to be restarted\nafter changing the mode. Continue?"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) { - return; - } - done(hpi_mode_map[change_mode_box->currentItem()]); - return; -} - - -void ChangeMode::cancelData() -{ - done(-1); -} diff --git a/utils/rdhpiinfo/change_mode.h b/utils/rdhpiinfo/change_mode.h deleted file mode 100644 index b66d44be..00000000 --- a/utils/rdhpiinfo/change_mode.h +++ /dev/null @@ -1,58 +0,0 @@ -// change_mode.h -// -// Change the mode of an AudioScience Adapter -// -// (C) Copyright 2002-2005,2016 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// 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. -// - -#ifndef CHANGE_MODE_H -#define CHANGE_MODE_H - -#define MAX_HPI_MODES 11 - -#include -#include - -#include -#ifndef HPI_ADAPTER_MODE_MULTICHANNEL -#define HPI_ADAPTER_MODE_MULTICHANNEL (9) -#endif - -class ChangeMode : public QDialog -{ - Q_OBJECT - public: - ChangeMode(unsigned short card,unsigned short type,int mode, - QWidget *parent=0); - QSize sizeHint() const; - QSizePolicy sizePolicy() const; - - protected: - void closeEvent(QCloseEvent *e); - - private slots: - void okData(); - void cancelData(); - - private: - int change_index; - uint32_t hpi_mode_map[MAX_HPI_MODES]; - QComboBox *change_mode_box; -}; - - -#endif - diff --git a/utils/rdhpiinfo/rdhpiinfo.cpp b/utils/rdhpiinfo/rdhpiinfo.cpp deleted file mode 100644 index d1d7535f..00000000 --- a/utils/rdhpiinfo/rdhpiinfo.cpp +++ /dev/null @@ -1,481 +0,0 @@ -// rdhpiinfo.cpp -// -// A Qt-based application for display information on ASI cards. -// -// (C) Copyright 2002-2014,2016 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// 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 -#include -#include -#include -#include - -#include - -#include "rdhpiinfo.h" -#include "change_mode.h" -#include "virtdetails.h" - -MainWidget::MainWidget(QWidget *parent) - :QWidget(parent) -{ - setCaption(tr("RDHPIInfo")+" v"+VERSION); - - // - // Fix the Window Size - // - setMinimumWidth(sizeHint().width()); - setMaximumWidth(sizeHint().width()); - setMinimumHeight(sizeHint().height()); - setMaximumHeight(sizeHint().height()); - - // - // Load the command-line arguments - // - RDCmdSwitch *cmd=new RDCmdSwitch(qApp->argc(),qApp->argv(),"rdhpiinfo", - RDHPIINFO_USAGE); - delete cmd; - - // - // Generate Fonts - // - QFont font("Helvetica",12,QFont::Normal); - font.setPixelSize(12); - QFont label_font("Helvetica",12,QFont::Bold); - label_font.setPixelSize(12); - - // - // Open HPI - // - if(HPI_SubSysCreate()==NULL) { - QMessageBox::warning(this,tr("HPI Error"), - tr("The ASI HPI Driver is not loaded!")); - exit(1); - } - - // - // HPI Version - // - HpiErr(HPI_SubSysGetVersionEx(NULL,&hpi_version),"HPI_SubSysGetVersionEx"); - QLabel *label=new QLabel(tr("HPI Version:"),this); - label->setGeometry(10,10,85,20); - label->setFont(label_font); - label=new QLabel(QString().sprintf("%d.%02d.%02d", - (unsigned)((hpi_version>>16)&0xffff), - (unsigned)((hpi_version>>8)&0xff), - (unsigned)hpi_version&0xff),this); - label->setGeometry(100,10,100,20); - label->setFont(font); - - // - // Adapter Name - // - info_name_box=new QComboBox(this); - info_name_box->setGeometry(100,34,sizeHint().width()-110,20); - info_name_box->setFont(font); - info_name_label=new QLabel(info_name_box,tr("Adapter:"),this); - info_name_label->setGeometry(10,34,85,20); - info_name_label->setFont(label_font); - info_name_label->setAlignment(AlignRight|AlignVCenter); - connect(info_name_box,SIGNAL(activated(int)), - this,SLOT(nameActivatedData(int))); - - // - // Adapter Index - // - label=new QLabel(tr("Adapter Index:"),this); - label->setGeometry(10,58,105,20); - label->setFont(label_font); - label->setAlignment(AlignRight|AlignVCenter); - info_index_label=new QLabel(this); - info_index_label->setGeometry(120,58,100,20); - info_index_label->setFont(font); - info_index_label->setAlignment(AlignLeft|AlignVCenter); - - // - // Serial Number - // - label=new QLabel(tr("Serial Number:"),this); - label->setGeometry(10,78,105,20); - label->setFont(label_font); - label->setAlignment(AlignRight|AlignVCenter); - info_serial_label=new QLabel(this); - info_serial_label->setGeometry(120,78,100,20); - info_serial_label->setFont(font); - info_serial_label->setAlignment(AlignLeft|AlignVCenter); - - // - // Output Streams - // - label=new QLabel(tr("Input Streams:"),this); - label->setGeometry(10,98,105,20); - label->setFont(label_font); - label->setAlignment(AlignRight|AlignVCenter); - info_istreams_label=new QLabel(this); - info_istreams_label->setGeometry(120,98,100,20); - info_istreams_label->setFont(font); - info_istreams_label->setAlignment(AlignLeft|AlignVCenter); - - // - // Input Streams - // - label=new QLabel(tr("Output Streams:"),this); - label->setGeometry(10,118,105,20); - label->setFont(label_font); - label->setAlignment(AlignRight|AlignVCenter); - info_ostreams_label=new QLabel(this); - info_ostreams_label->setGeometry(120,118,100,20); - info_ostreams_label->setFont(font); - info_ostreams_label->setAlignment(AlignLeft|AlignVCenter); - - // - // DSP Version - // - label=new QLabel(tr("DSP Version:"),this); - label->setGeometry(10,138,105,20); - label->setFont(label_font); - label->setAlignment(AlignRight|AlignVCenter); - info_dsp_label=new QLabel(this); - info_dsp_label->setGeometry(120,138,100,20); - info_dsp_label->setFont(font); - info_dsp_label->setAlignment(AlignLeft|AlignVCenter); - - // - // Adapter Version - // - label=new QLabel(tr("Adapter Version:"),this); - label->setGeometry(10,158,105,20); - label->setFont(label_font); - label->setAlignment(AlignRight|AlignVCenter); - info_adapter_label=new QLabel(this); - info_adapter_label->setGeometry(120,158,100,20); - info_adapter_label->setFont(font); - info_adapter_label->setAlignment(AlignLeft|AlignVCenter); - - // - // DSP Utilization - // - info_utilization_label=new QLabel(tr("DSP Utilization")+":",this); - info_utilization_label->setGeometry(10,183,105,20); - info_utilization_label->setFont(label_font); - info_utilization_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - info_utilization_label->setDisabled(true); - info_utilization_edit=new QLineEdit(this); - info_utilization_edit->setGeometry(120,183,60,20); - info_utilization_edit->setFont(font); - info_utilization_edit->setReadOnly(true); - info_utilization_edit->setDisabled(true); - info_utilization_button=new QPushButton(tr("Details"),this); - info_utilization_button->setGeometry(190,180,70,26); - info_utilization_button->setFont(font); - info_utilization_button->setDisabled(true); - connect(info_utilization_button,SIGNAL(clicked()), - this,SLOT(utilizationData())); - - // - // Adapter Mode - // - label=new QLabel(tr("Adapter Mode:"),this); - label->setGeometry(10,213,105,20); - label->setFont(label_font); - label->setAlignment(AlignRight|AlignVCenter); - info_mode_edit=new QLineEdit(this); - info_mode_edit->setGeometry(120,213,sizeHint().width()-210,20); - info_mode_edit->setReadOnly(true); - info_mode_edit->setFont(font); - info_mode_edit->setAlignment(AlignLeft|AlignVCenter); - info_changemode_button= - new QPushButton(tr("Change"),this); - info_changemode_button->setGeometry(sizeHint().width()-80,210,70,26); - info_changemode_button->setFont(font); - connect(info_changemode_button,SIGNAL(clicked()), - this,SLOT(changeModeData())); - - // - // Close Button - // - QPushButton *button=new QPushButton(tr("Close"),this); - button->setGeometry(sizeHint().width()-60,sizeHint().height()-40,50,30); - button->setFont(label_font); - connect(button,SIGNAL(clicked()),qApp,SLOT(quit())); - - LoadAdapters(); - - hpi_profile_timer=new QTimer(this); - connect(hpi_profile_timer,SIGNAL(timeout()), - this,SLOT(updateDspUtilization())); - - if(info_name_box->count()>0) { - nameActivatedData(0); - hpi_profile_timer->start(1000); - } -} - - -MainWidget::~MainWidget() -{ - HPI_SubSysFree(NULL); -} - - -QSize MainWidget::sizeHint() const -{ - return QSize(400,290); -} - - -QSizePolicy MainWidget::sizePolicy() const -{ - return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); -} - - -void MainWidget::nameActivatedData(int id) -{ - QString str; - int card=name_map[id]; - info_index_label-> - setText(QString().sprintf("%u",(unsigned)hpi_indexes[card]+1)); - info_serial_label-> - setText(QString().sprintf("%u",(unsigned)hpi_serial[card])); - info_istreams_label-> - setText(QString().sprintf("%d",hpi_istreams[card])); - info_ostreams_label-> - setText(QString().sprintf("%d",hpi_ostreams[card])); - info_dsp_label->setText(QString().sprintf("%d.%d", - hpi_card_version[card]>>13, - (hpi_card_version[card]>>7)&63)); - info_adapter_label-> - setText(QString().sprintf("%c%d", - ((hpi_card_version[card]>>3)&15)+'A', - hpi_card_version[card]&7)); - switch(hpi_mode[card]) { - case 0: // No mode support - info_mode_edit->setText(tr("Standard")); - info_changemode_button->setDisabled(true); - break; - - case HPI_ADAPTER_MODE_4OSTREAM: - info_mode_edit->setText(tr("Four Output Streams")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_6OSTREAM: - info_mode_edit->setText(tr("Six Output Streams")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_8OSTREAM: - info_mode_edit->setText(tr("Eight Output Streams")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_12OSTREAM: - info_mode_edit->setText(tr("Twelve Output Streams")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_16OSTREAM: - info_mode_edit->setText(tr("Sixteen Output Streams")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_1OSTREAM: - info_mode_edit->setText(tr("One Output Stream")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_1: - info_mode_edit->setText(tr("Mode 1")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_2: - info_mode_edit->setText(tr("Mode 2")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_3: - info_mode_edit->setText(tr("Mode 3")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_MULTICHANNEL: - info_mode_edit->setText(tr("Surround Sound [SSX]")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_9OSTREAM: - info_mode_edit->setText(tr("Nine Output Stream")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_MONO: - info_mode_edit->setText(tr("Mono Mode")); - info_changemode_button->setEnabled(true); - break; - - case HPI_ADAPTER_MODE_LOW_LATENCY: - info_mode_edit->setText(tr("Low Latency Mode")); - info_changemode_button->setEnabled(true); - break; - - default: - info_mode_edit->setText(tr("N/A")); - info_changemode_button->setDisabled(true); - if(hpi_mode[card]!=hpi_serial[card]) { - str=QString(tr("rdhpiinfo: unknown adapter mode")); - fprintf(stderr,"%s %d\n",(const char *)str,hpi_mode[card]); - } - break; - } -} - - -void MainWidget::changeModeData() -{ - int card=name_map[info_name_box->currentItem()]; - int mode; - QString str; - hpi_err_t hpi_err; - char hpi_text[100]; - ChangeMode *dialog=new ChangeMode(card,hpi_type[card],hpi_mode[card],this); - if((mode=dialog->exec())<0) { - delete dialog; - return; - } - delete dialog; - hpi_err=HPI_AdapterOpen(NULL,card); - if((hpi_err=HPI_AdapterSetMode(NULL,card,mode))==0) { - QMessageBox::information(this,tr("RdhpiInfo"), - tr("The adapter mode has been changed.\nYou must now restart the HPI driver!")); - } - else { - HPI_GetErrorText(hpi_err,hpi_text); - str=QString(tr("HPI Error")); - QMessageBox::warning(this,tr("RdhpiInfo"), - QString().sprintf("%s %d:\n\"%s\"",(const char *)str, - (int)hpi_err,hpi_text)); - } - hpi_err=HPI_AdapterClose(NULL,card); -} - - -void MainWidget::utilizationData() -{ - VirtDetails *d=new VirtDetails(hpi_indexes[info_name_box->currentItem()], - hpi_profile[info_name_box->currentItem()], - hpi_profile_quan[info_name_box->currentItem()], - this); - hpi_profile_timer->stop(); - d->exec(); - hpi_profile_timer->start(1000); - delete d; -} - - -void MainWidget::updateDspUtilization() -{ - uint32_t util=0; - - if(HpiErr(HPI_ProfileGetUtilization(NULL, - hpi_profile[info_name_box->currentItem()], - &util))==0) { - info_utilization_edit->setText(QString().sprintf("%5.1lf%%", - (double)util/100.0)); - info_utilization_label->setEnabled(true); - info_utilization_edit->setEnabled(true); - info_utilization_button->setEnabled(true); - } - else { - info_utilization_edit->setText("xx.x"); - info_utilization_label->setDisabled(true); - info_utilization_edit->setDisabled(true); - info_utilization_button->setDisabled(true); - } -} - - -void MainWidget::LoadAdapters() -{ - int num_adapters; - - HpiErr(HPI_SubSysGetNumAdapters(NULL,&num_adapters), - "HPI_SubSysGetNumAdapters"); - for(int i=0;iinsertItem(QString().sprintf("AudioScience %X [%d]", - hpi_type[i],i+1)); - name_map[info_name_box->count()-1]=i; - HpiErr(HPI_AdapterOpen(NULL,hpi_indexes[i]),"HPI_AdapterOpen"); - HpiErr(HPI_AdapterGetInfo(NULL,hpi_indexes[i],&hpi_ostreams[i],&hpi_istreams[i], - &hpi_card_version[i],hpi_serial+i, - &hpi_type[i]),"HPI_AdapterGetInfo"); - HpiErr(HPI_AdapterGetMode(NULL,hpi_indexes[i],&hpi_mode[i]), - "HPI_AdapterGetMode"); - HpiErr(HPI_AdapterClose(NULL,hpi_indexes[i]),"HPI_AdapterClose"); - HpiErr(HPI_ProfileOpenAll(NULL,hpi_indexes[i],0,&hpi_profile[i], - &hpi_profile_quan[i])); - } - } -} - - -hpi_err_t MainWidget::HpiErr(hpi_err_t err,const char *func_name) const -{ - char hpi_str[200]; - - if(err==HPI_ERROR_INVALID_FUNC) { - return err; - } - if(err!=0) { - HPI_GetErrorText(err,hpi_str); - if(func_name==NULL) { - fprintf(stderr,"rdhpiinfo: %s\n",hpi_str); - } - else { - fprintf(stderr,"rdhpiinfo[%s]: %s\n",func_name,hpi_str); - } - } - return err; -} - - -int main(int argc,char *argv[]) -{ - QApplication a(argc,argv); - - // - // Start Event Loop - // - MainWidget *w=new MainWidget(); - a.setMainWidget(w); - w->setGeometry(QRect(QPoint(0,0),w->sizeHint())); - w->show(); - return a.exec(); -} diff --git a/utils/rdhpiinfo/rdhpiinfo.h b/utils/rdhpiinfo/rdhpiinfo.h deleted file mode 100644 index 5fa5d2bd..00000000 --- a/utils/rdhpiinfo/rdhpiinfo.h +++ /dev/null @@ -1,86 +0,0 @@ -// rdhpiinfo.h -// -// A Qt-based application for display info about ASI cards. -// -// (C) Copyright 2002-2005,2016 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// 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. -// - -#ifndef RDHPIINFO_H -#define RDHPIINFO_H - -#include -#include -#include -#include -#include -#include - -#include -#if HPI_VER < 0x040600 -typedef uint16_t hpi_err_t; -typedef uint32_t hpi_handle_t; -#endif - -#define RDHPIINFO_USAGE "\n" - -class MainWidget : public QWidget -{ - Q_OBJECT - public: - MainWidget(QWidget *parent=0); - ~MainWidget(); - QSize sizeHint() const; - QSizePolicy sizePolicy() const; - - private slots: - void nameActivatedData(int id); - void changeModeData(); - void utilizationData(); - void updateDspUtilization(); - - private: - void LoadAdapters(); - hpi_err_t HpiErr(hpi_err_t err,const char *func_name=0) const; - QLabel *info_name_label; - QComboBox *info_name_box; - QLabel *info_utilization_label; - QLineEdit *info_utilization_edit; - QPushButton *info_utilization_button; - QLabel *info_index_label; - QLabel *info_serial_label; - QLabel *info_istreams_label; - QLabel *info_ostreams_label; - QLabel *info_dsp_label; - QLabel *info_adapter_label; - QLineEdit *info_mode_edit; - QPushButton *info_changemode_button; - uint32_t hpi_version; - QString hpi_name[HPI_MAX_ADAPTERS]; - int name_map[HPI_MAX_ADAPTERS]; - uint32_t hpi_indexes[HPI_MAX_ADAPTERS]; - uint16_t hpi_ostreams[HPI_MAX_ADAPTERS]; - uint16_t hpi_istreams[HPI_MAX_ADAPTERS]; - uint16_t hpi_card_version[HPI_MAX_ADAPTERS]; - uint32_t hpi_serial[HPI_MAX_ADAPTERS]; - uint16_t hpi_type[HPI_MAX_ADAPTERS]; - uint32_t hpi_mode[HPI_MAX_ADAPTERS]; - hpi_handle_t hpi_profile[HPI_MAX_ADAPTERS]; - uint16_t hpi_profile_quan[HPI_MAX_ADAPTERS]; - QTimer *hpi_profile_timer; -}; - - -#endif // RDHPIINFO_H diff --git a/utils/rdhpiinfo/rdhpiinfo.pro b/utils/rdhpiinfo/rdhpiinfo.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/utils/rdhpiinfo/virtdetails.cpp b/utils/rdhpiinfo/virtdetails.cpp deleted file mode 100644 index 665f0054..00000000 --- a/utils/rdhpiinfo/virtdetails.cpp +++ /dev/null @@ -1,200 +0,0 @@ -// virtdetails.cpp -// -// Show profile details for an AudioScience adapter. -// -// (C) Copyright 2014 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// 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 "virtdetails.h" - -VirtDetails::VirtDetails(uint16_t card,hpi_handle_t profile, - uint16_t profile_quan,QWidget *parent) - : QDialog(parent,"",true) -{ - char name[200]; - - virt_card=card; - virt_profile=profile; - - // - // Fix the Window Size - // - setMinimumWidth(sizeHint().width()); - setMaximumWidth(sizeHint().width()); - setMinimumHeight(sizeHint().height()); - setMaximumHeight(sizeHint().height()); - - setCaption(tr("RdHPIInfo - Profile Details")); - - // - // Create Fonts - // - QFont font=QFont("Helvetica",12,QFont::Normal); - font.setPixelSize(12); - QFont label_font=QFont("Helvetica",12,QFont::Bold); - label_font.setPixelSize(12); - - // - // Adapter Mode - // - virt_profile_box=new QComboBox(this); - virt_profile_box->setGeometry(75,10,sizeHint().width()-85,20); - virt_profile_box->setFont(font); - virt_profile_label=new QLabel(virt_profile_box,tr("Profile")+":",this); - virt_profile_label->setGeometry(10,10,60,20); - virt_profile_label->setFont(label_font); - virt_profile_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - for(uint16_t i=0;iinsertItem(name); - } - } - } - - // - // Utilization Counter - // - virt_utilization_label=new QLabel(tr("Overall DSP Utilization")+":",this); - virt_utilization_label->setGeometry(10,35,160,20); - virt_utilization_label->setFont(label_font); - virt_utilization_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - virt_utilization_edit=new QLineEdit(this); - virt_utilization_edit->setGeometry(175,35,90,20); - virt_utilization_edit->setFont(font); - virt_utilization_edit->setReadOnly(true); - - // - // Profile Interval Counter - // - virt_interval_label=new QLabel(tr("Profile Interval")+":",this); - virt_interval_label->setGeometry(10,57,160,20); - virt_interval_label->setFont(label_font); - virt_interval_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - virt_interval_edit=new QLineEdit(this); - virt_interval_edit->setGeometry(175,57,90,20); - virt_interval_edit->setFont(font); - virt_interval_edit->setReadOnly(true); - - // - // Total Tick Count Counter - // - virt_total_ticks_label=new QLabel(tr("Total Tick Count")+":",this); - virt_total_ticks_label->setGeometry(10,79,160,20); - virt_total_ticks_label->setFont(label_font); - virt_total_ticks_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - virt_total_ticks_edit=new QLineEdit(this); - virt_total_ticks_edit->setGeometry(175,79,90,20); - virt_total_ticks_edit->setFont(font); - virt_total_ticks_edit->setReadOnly(true); - - // - // Call Count Counter - // - virt_call_count_label=new QLabel(tr("Call Count")+":",this); - virt_call_count_label->setGeometry(10,101,160,20); - virt_call_count_label->setFont(label_font); - virt_call_count_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - virt_call_count_edit=new QLineEdit(this); - virt_call_count_edit->setGeometry(175,101,90,20); - virt_call_count_edit->setFont(font); - virt_call_count_edit->setReadOnly(true); - - // - // Maximum Ticks Counter - // - virt_max_ticks_label=new QLabel(tr("Maximum Ticks / Pass")+":",this); - virt_max_ticks_label->setGeometry(10,123,160,20); - virt_max_ticks_label->setFont(label_font); - virt_max_ticks_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - virt_max_ticks_edit=new QLineEdit(this); - virt_max_ticks_edit->setGeometry(175,123,90,20); - virt_max_ticks_edit->setFont(font); - virt_max_ticks_edit->setReadOnly(true); - - // - // Ticks per Millisecond Counter - // - virt_ticks_per_ms_label=new QLabel(tr("Ticks / mS")+":",this); - virt_ticks_per_ms_label->setGeometry(10,145,160,20); - virt_ticks_per_ms_label->setFont(label_font); - virt_ticks_per_ms_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - virt_ticks_per_ms_edit=new QLineEdit(this); - virt_ticks_per_ms_edit->setGeometry(175,145,90,20); - virt_ticks_per_ms_edit->setFont(font); - virt_ticks_per_ms_edit->setReadOnly(true); - - // - // Close Button - // - QPushButton *close_button=new QPushButton(this); - close_button->setGeometry(sizeHint().width()-70,sizeHint().height()-40, - 60,30); - close_button->setFont(font); - close_button->setText(tr("&Close")); - connect(close_button,SIGNAL(clicked()),this,SLOT(closeData())); - - QTimer *timer=new QTimer(this); - connect(timer,SIGNAL(timeout()),this,SLOT(updateProfileData())); - timer->start(1000); -} - - -QSize VirtDetails::sizeHint() const -{ - return QSize(280,222); -} - - -QSizePolicy VirtDetails::sizePolicy() const -{ - return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); -} - - -void VirtDetails::updateProfileData() -{ - uint32_t utilization; - uint16_t interval; - uint32_t total_ticks; - uint32_t call_count; - uint32_t max_ticks; - uint32_t ticks_per_ms; - - if(HPI_ProfileGetUtilization(NULL,virt_profile,&utilization)==0) { - virt_utilization_edit-> - setText(QString().sprintf("%5.1lf%%",(double)utilization/100.0)); - } - if(HPI_ProfileGet(NULL,virt_profile,virt_profile_box->currentItem(), - &interval,&total_ticks,&call_count,&max_ticks, - &ticks_per_ms)==0) { - virt_interval_edit->setText(QString().sprintf("%u sec",interval)); - virt_total_ticks_edit->setText(QString().sprintf("%u",total_ticks)); - virt_call_count_edit->setText(QString().sprintf("%u",call_count)); - virt_max_ticks_edit->setText(QString().sprintf("%u",max_ticks)); - virt_ticks_per_ms_edit->setText(QString().sprintf("%u",ticks_per_ms)); - } -} - - -void VirtDetails::closeData() -{ - done(0); -} diff --git a/utils/rdhpiinfo/virtdetails.h b/utils/rdhpiinfo/virtdetails.h deleted file mode 100644 index 8082d419..00000000 --- a/utils/rdhpiinfo/virtdetails.h +++ /dev/null @@ -1,66 +0,0 @@ -// virtdetails.h -// -// Show profiling data for an AudioScience adapter -// -// (C) Copyright 2014 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// 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. -// - -#ifndef VIRTDETAILS_H -#define VIRTDETAILS_H - -#include - -#include -#include -#include -#include - -#include - -class VirtDetails : public QDialog -{ - Q_OBJECT - public: - VirtDetails(uint16_t card,hpi_handle_t profile,uint16_t profile_quan, - QWidget *parent=0); - QSize sizeHint() const; - QSizePolicy sizePolicy() const; - -private slots: - void updateProfileData(); - void closeData(); - - private: - uint16_t virt_card; - hpi_handle_t virt_profile; - QLabel *virt_utilization_label; - QLineEdit *virt_utilization_edit; - QLabel *virt_profile_label; - QComboBox *virt_profile_box; - QLabel *virt_interval_label; - QLineEdit *virt_interval_edit; - QLabel *virt_total_ticks_label; - QLineEdit *virt_total_ticks_edit; - QLabel *virt_call_count_label; - QLineEdit *virt_call_count_edit; - QLabel *virt_max_ticks_label; - QLineEdit *virt_max_ticks_edit; - QLabel *virt_ticks_per_ms_label; - QLineEdit *virt_ticks_per_ms_edit; -}; - - -#endif // VIRTDETAILS_H diff --git a/xdg/Makefile.am b/xdg/Makefile.am index 990c4bf1..03e1f1a4 100644 --- a/xdg/Makefile.am +++ b/xdg/Makefile.am @@ -31,7 +31,6 @@ install-exec-am: cp rivendell-rddgimport.desktop $(DESTDIR)@prefix@/share/applications/ cp rivendell-rddiscimport.desktop $(DESTDIR)@prefix@/share/applications/ cp rivendell-rdgpimon.desktop $(DESTDIR)@prefix@/share/applications/ - if test -f ../rdhpi/.libs/librdhpi-@VERSION@.so ; then cp rivendell-rdhpiinfo-root.desktop $(DESTDIR)@prefix@/share/applications/ ; fi cp rivendell-rdlibrary.desktop $(DESTDIR)@prefix@/share/applications/ cp rivendell-rdlogedit.desktop $(DESTDIR)@prefix@/share/applications/ cp rivendell-rdlogin.desktop $(DESTDIR)@prefix@/share/applications/ @@ -48,30 +47,21 @@ install-exec-am: cp *.menu $(DESTDIR)/etc/xdg/menus/applications-merged/ mkdir -p $(DESTDIR)/etc/pam.d cp rdalsaconfig-root-pam $(DESTDIR)/etc/pam.d/rdalsaconfig-root - if test -f ../rdhpi/.libs/librdhpi-@VERSION@.so ; then cp rdhpiinfo-root-pam $(DESTDIR)/etc/pam.d/rdhpiinfo-root ; fi mkdir -p $(DESTDIR)/etc/security/console.apps cp rdalsaconfig-root-consolehelper $(DESTDIR)/etc/security/console.apps/rdalsaconfig-root - if test -f ../rdhpi/.libs/librdhpi-@VERSION@.so ; then cp rdhpiinfo-root-consolehelper $(DESTDIR)/etc/security/console.apps/rdhpiinfo-root ; fi rm -f $(DESTDIR)$(prefix)/bin/rdalsaconfig-root ln -s /usr/bin/consolehelper $(DESTDIR)$(prefix)/bin/rdalsaconfig-root - rm -f $(DESTDIR)$(prefix)/bin/rdhpiinfo-root - if test -f ../rdhpi/.libs/librdhpi-@VERSION@.so ; then ln -s /usr/bin/consolehelper $(DESTDIR)$(prefix)/bin/rdhpiinfo-root ; fi uninstall-local: rm -f $(DESTDIR)@prefix@/share/applications/rivendell-*.desktop rm -f $(DESTDIR)@prefix@/share/desktop-directories/rivendell-*.directory rm -f $(DESTDIR)/etc/xdg/menus/applications-merged/rivendell-*.menu rm -f $(DESTDIR)/etc/pam.d/rdalsaconfig-root - rm -f $(DESTDIR)/etc/pam.d/rdhpiinfo-root rm -f $(DESTDIR)/etc/security/console.apps/rdalsaconfig-root - rm -f $(DESTDIR)/etc/security/console.apps/rdhpiinfo-root rm -f $(DESTDIR)$(prefix)/bin/rdalsaconfig-root - rm -f $(DESTIDR)$(prefix)/bin/rdhpiinfo-root EXTRA_DIST = rdalsaconfig-root-consolehelper\ rdalsaconfig-root-pam\ - rdhpiinfo-root-consolehelper\ - rdhpiinfo-root-pam\ rivendell-configuration.directory\ rivendell-documentation.directory\ rivendell-logtools.directory\ @@ -87,8 +77,6 @@ EXTRA_DIST = rdalsaconfig-root-consolehelper\ rivendell-rddgimport.desktop\ rivendell-rddiscimport.desktop\ rivendell-rdgpimon.desktop\ - rivendell-rdhpiinfo.desktop\ - rivendell-rdhpiinfo-root.desktop\ rivendell-rdlibrary.desktop\ rivendell-rdlogedit.desktop\ rivendell-rdlogin.desktop\ diff --git a/xdg/rdhpiinfo-root-consolehelper b/xdg/rdhpiinfo-root-consolehelper deleted file mode 100644 index ff490ec1..00000000 --- a/xdg/rdhpiinfo-root-consolehelper +++ /dev/null @@ -1,3 +0,0 @@ -USER=root -PROGRAM=/usr/bin/rdhpiinfo -SESSION=true diff --git a/xdg/rdhpiinfo-root-pam b/xdg/rdhpiinfo-root-pam deleted file mode 100644 index b95f5243..00000000 --- a/xdg/rdhpiinfo-root-pam +++ /dev/null @@ -1,4 +0,0 @@ -#%PAM-1.0 -auth include config-util -account include config-util -session include config-util diff --git a/xdg/rivendell-rdhpiinfo-root.desktop b/xdg/rivendell-rdhpiinfo-root.desktop deleted file mode 100644 index 117e8716..00000000 --- a/xdg/rivendell-rdhpiinfo-root.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Encoding=UTF-8 -Terminal=false -Categories=Qt;KDE;Rivendell; -Name=RDHPIInfo -GenericName=AudioScience Card Information -Exec=rdhpiinfo-root -Icon=rivendell -Type=Application -Terminal=false diff --git a/xdg/rivendell-rdhpiinfo.desktop b/xdg/rivendell-rdhpiinfo.desktop deleted file mode 100644 index 34d9a00f..00000000 --- a/xdg/rivendell-rdhpiinfo.desktop +++ /dev/null @@ -1,12 +0,0 @@ -[Desktop Entry] -Encoding=UTF-8 -Terminal=false -Categories=Qt;KDE;Rivendell; -Name=RDHPIInfo -GenericName=AudioScience Card Information -Exec=rdhpiinfo -Icon=rivendell -Type=Application -Terminal=false -X-KDE-SubstituteUID=true -X-KDE-Username=root From dbd4d865f92575a2b6127369055f6247ee37d664 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 20 Mar 2018 11:00:03 -0400 Subject: [PATCH 6/9] 2018-03-20 Fred Gleason * Removed event checks when update Playout events in rdcatch(1). --- ChangeLog | 2 + rdcatch/edit_playout.cpp | 79 ---------------------------------------- rdcatch/edit_playout.h | 1 - rdcatch/rdcatch_cs.ts | 4 +- rdcatch/rdcatch_de.ts | 4 +- rdcatch/rdcatch_es.ts | 4 +- rdcatch/rdcatch_fr.ts | 8 ---- rdcatch/rdcatch_nb.ts | 4 +- rdcatch/rdcatch_nn.ts | 4 +- rdcatch/rdcatch_pt_BR.ts | 4 +- 10 files changed, 14 insertions(+), 100 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a9bea71..e4874858 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16621,3 +16621,5 @@ * Incremented the package version to 2.19.0int00. 2018-03-20 Fred Gleason * Removed rdhpiinfo(8). +2018-03-20 Fred Gleason + * Removed event checks when update Playout events in rdcatch(1). diff --git a/rdcatch/edit_playout.cpp b/rdcatch/edit_playout.cpp index e9941de9..b75e08c0 100644 --- a/rdcatch/edit_playout.cpp +++ b/rdcatch/edit_playout.cpp @@ -333,11 +333,6 @@ void EditPlayout::selectCutData() void EditPlayout::saveasData() { - if(!CheckEvent(true)) { - QMessageBox::warning(this,tr("Duplicate Event"), - tr("An event with these parameters already exists!")); - return; - } delete edit_recording; edit_recording=new RDRecording(-1,true); edit_added_events->push_back(edit_recording->id()); @@ -347,11 +342,6 @@ void EditPlayout::saveasData() void EditPlayout::okData() { - if(!CheckEvent(false)) { - QMessageBox::warning(this,tr("Duplicate Event"), - tr("An event with these parameters already exists!")); - return; - } Save(); done(0); } @@ -451,72 +441,3 @@ void EditPlayout::Save() edit_recording->setSun(edit_sun_button->isChecked()); edit_recording->setOneShot(edit_oneshot_box->isChecked()); } - - -bool EditPlayout::CheckEvent(bool include_myself) -{ - char station[65]; - char gunk[3]; - int chan; - QTime test_start_time; - QTime test_end_time; - - RDCut *cut=new RDCut(edit_cutname); - QTime start_time=edit_starttime_edit->time(); - QTime end_time=edit_starttime_edit->time().addMSecs(cut->length()); - delete cut; - - sscanf((const char *)edit_station_box->currentText(),"%s%s%d", - station,gunk,&chan); - QString sql= - QString().sprintf("select RECORDINGS.START_TIME,CUTS.LENGTH\ - from RECORDINGS left join CUTS\ - on(RECORDINGS.CUT_NAME=CUTS.CUT_NAME)\ - where (RECORDINGS.STATION_NAME=\"%s\")&&\ - (RECORDINGS.TYPE=%d)&&(RECORDINGS.CHANNEL=%d)", - station,RDRecording::Playout,chan+128); - if(edit_sun_button->isChecked()) { - sql+="&&(RECORDINGS.SUN=\"Y\")"; - } - if(edit_mon_button->isChecked()) { - sql+="&&(RECORDINGS.MON=\"Y\")"; - } - if(edit_tue_button->isChecked()) { - sql+="&&(RECORDINGS.TUE=\"Y\")"; - } - if(edit_wed_button->isChecked()) { - sql+="&&(RECORDINGS.WED=\"Y\")"; - } - if(edit_thu_button->isChecked()) { - sql+="&&(RECORDINGS.THU=\"Y\")"; - } - if(edit_fri_button->isChecked()) { - sql+="&&(RECORDINGS.FRI=\"Y\")"; - } - if(edit_sat_button->isChecked()) { - sql+="&&(RECORDINGS.SAT=\"Y\")"; - } - if(!include_myself) { - sql+=QString().sprintf("&&(RECORDINGS.ID!=%d)",edit_recording->id()); - } - RDSqlQuery *q=new RDSqlQuery(sql); - while(q->next()) { - test_start_time=q->value(0).toTime(); - test_end_time=q->value(0).toTime().addMSecs(q->value(1).toUInt()); - if(test_end_timetest_start_time)&&(start_time>test_end_time)&& - (end_time>test_start_time)&&(end_time>test_end_time))) { - } - else { - delete q; - return false; - } - } - delete q; - - return true; -} diff --git a/rdcatch/edit_playout.h b/rdcatch/edit_playout.h index 3614c866..b23be17a 100644 --- a/rdcatch/edit_playout.h +++ b/rdcatch/edit_playout.h @@ -59,7 +59,6 @@ class EditPlayout : public QDialog private: void PopulateDecks(QComboBox *box); void Save(); - bool CheckEvent(bool include_myself); RDDeck *edit_deck; RDRecording *edit_recording; QCheckBox *edit_active_button; diff --git a/rdcatch/rdcatch_cs.ts b/rdcatch/rdcatch_cs.ts index 19b13b5f..3dc0d70e 100644 --- a/rdcatch/rdcatch_cs.ts +++ b/rdcatch/rdcatch_cs.ts @@ -432,11 +432,11 @@ nové Duplicate Event - Zdvojená událost + Zdvojená událost An event with these parameters already exists! - Událost s těmito parametry již existuje! + Událost s těmito parametry již existuje! diff --git a/rdcatch/rdcatch_de.ts b/rdcatch/rdcatch_de.ts index 144216ad..50f072c8 100644 --- a/rdcatch/rdcatch_de.ts +++ b/rdcatch/rdcatch_de.ts @@ -432,11 +432,11 @@ Neu Duplicate Event - Doppeltes Event + Doppeltes Event An event with these parameters already exists! - Ein Event mit diesen Parametern existiert bereits! + Ein Event mit diesen Parametern existiert bereits! diff --git a/rdcatch/rdcatch_es.ts b/rdcatch/rdcatch_es.ts index 7e218392..8ba054a2 100644 --- a/rdcatch/rdcatch_es.ts +++ b/rdcatch/rdcatch_es.ts @@ -426,11 +426,11 @@ como Nuevo Duplicate Event - Evento duplicado + Evento duplicado An event with these parameters already exists! - ¡Un evento con esos parámetros ya existe! + ¡Un evento con esos parámetros ya existe! &Save As diff --git a/rdcatch/rdcatch_fr.ts b/rdcatch/rdcatch_fr.ts index ed28fca0..16a850d8 100644 --- a/rdcatch/rdcatch_fr.ts +++ b/rdcatch/rdcatch_fr.ts @@ -427,14 +427,6 @@ New &Cancel - - Duplicate Event - - - - An event with these parameters already exists! - - EditRecording diff --git a/rdcatch/rdcatch_nb.ts b/rdcatch/rdcatch_nb.ts index f7cd1950..0187551f 100644 --- a/rdcatch/rdcatch_nb.ts +++ b/rdcatch/rdcatch_nb.ts @@ -429,11 +429,11 @@ New Duplicate Event - Kopier hending + Kopier hending An event with these parameters already exists! - Det finst alt ei hending med dette oppsettet! + Det finst alt ei hending med dette oppsettet! diff --git a/rdcatch/rdcatch_nn.ts b/rdcatch/rdcatch_nn.ts index f7cd1950..0187551f 100644 --- a/rdcatch/rdcatch_nn.ts +++ b/rdcatch/rdcatch_nn.ts @@ -429,11 +429,11 @@ New Duplicate Event - Kopier hending + Kopier hending An event with these parameters already exists! - Det finst alt ei hending med dette oppsettet! + Det finst alt ei hending med dette oppsettet! diff --git a/rdcatch/rdcatch_pt_BR.ts b/rdcatch/rdcatch_pt_BR.ts index e19facf1..2c3b476b 100644 --- a/rdcatch/rdcatch_pt_BR.ts +++ b/rdcatch/rdcatch_pt_BR.ts @@ -432,11 +432,11 @@ Novo Duplicate Event - Duplicar Evento + Duplicar Evento An event with these parameters already exists! - Um Evento com estes parâmetros já existe! + Um Evento com estes parâmetros já existe! From 626a04c4071cd1171023108a9a557a6534d6eff0 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 20 Mar 2018 11:06:25 -0400 Subject: [PATCH 7/9] 2018-03-20 Fred Gleason * Updated the date in the copyright notice in rdadmin(1). --- ChangeLog | 2 ++ rdadmin/info_dialog.cpp | 2 +- rdadmin/rdadmin_cs.ts | 6 +++++- rdadmin/rdadmin_de.ts | 6 +++++- rdadmin/rdadmin_es.ts | 6 +++++- rdadmin/rdadmin_fr.ts | 2 +- rdadmin/rdadmin_nb.ts | 6 +++++- rdadmin/rdadmin_nn.ts | 6 +++++- rdadmin/rdadmin_pt_BR.ts | 6 +++++- 9 files changed, 34 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index e4874858..c7336b20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16623,3 +16623,5 @@ * Removed rdhpiinfo(8). 2018-03-20 Fred Gleason * Removed event checks when update Playout events in rdcatch(1). +2018-03-20 Fred Gleason + * Updated the date in the copyright notice in rdadmin(1). diff --git a/rdadmin/info_dialog.cpp b/rdadmin/info_dialog.cpp index 7765ea15..20307794 100644 --- a/rdadmin/info_dialog.cpp +++ b/rdadmin/info_dialog.cpp @@ -126,7 +126,7 @@ InfoDialog::InfoDialog(QWidget *parent) // // Signature // - str=QString(tr("Copyright 2002-2014")); + str=QString(tr("Copyright 2002-2018")); label=new QLabel(QString().sprintf("%s %s",(const char *)str, PACKAGE_BUGREPORT),this); label->setGeometry(10,87,sizeHint().width()-20,14); diff --git a/rdadmin/rdadmin_cs.ts b/rdadmin/rdadmin_cs.ts index 5fefc2a7..faf1e60f 100644 --- a/rdadmin/rdadmin_cs.ts +++ b/rdadmin/rdadmin_cs.ts @@ -4417,7 +4417,11 @@ GNU Library General Public License. Klepněte na tlačítko pro zobrazení povol Copyright 2002-2014 - Autorské právo 2002-2014 + Autorské právo 2002-2014 + + + Copyright 2002-2018 + Autorské právo 2002-2018 diff --git a/rdadmin/rdadmin_de.ts b/rdadmin/rdadmin_de.ts index 4706ee01..27246b60 100644 --- a/rdadmin/rdadmin_de.ts +++ b/rdadmin/rdadmin_de.ts @@ -4365,7 +4365,11 @@ anzeigen Copyright 2002-2014 - Copyright 2002-2014 + Copyright 2002-2014 + + + Copyright 2002-2018 + Copyright 2002-2018 diff --git a/rdadmin/rdadmin_es.ts b/rdadmin/rdadmin_es.ts index 4195363d..2d3d0141 100644 --- a/rdadmin/rdadmin_es.ts +++ b/rdadmin/rdadmin_es.ts @@ -4372,7 +4372,11 @@ PARA UN PROPÓSITO PARTICULAR. Oprima el botón "Ver licencia" para d Copyright 2002-2014 - Copyright 2002-2014 + Copyright 2002-2014 + + + Copyright 2002-2018 + Copyright 2002-2018 diff --git a/rdadmin/rdadmin_fr.ts b/rdadmin/rdadmin_fr.ts index d3f4f32a..bbe522fd 100644 --- a/rdadmin/rdadmin_fr.ts +++ b/rdadmin/rdadmin_fr.ts @@ -3897,7 +3897,7 @@ PARTICULAR PURPOSE. Touch the "View License" button for details. - Copyright 2002-2014 + Copyright 2002-2018 diff --git a/rdadmin/rdadmin_nb.ts b/rdadmin/rdadmin_nb.ts index e1e91972..88650d45 100644 --- a/rdadmin/rdadmin_nb.ts +++ b/rdadmin/rdadmin_nb.ts @@ -4339,7 +4339,11 @@ Klikk på "Lisens"-knappen for fleire opplysningar. Copyright 2002-2014 - Copyright 2002-2014 + Copyright 2002-2014 + + + Copyright 2002-2018 + Copyright 2002-2018 diff --git a/rdadmin/rdadmin_nn.ts b/rdadmin/rdadmin_nn.ts index e1e91972..88650d45 100644 --- a/rdadmin/rdadmin_nn.ts +++ b/rdadmin/rdadmin_nn.ts @@ -4339,7 +4339,11 @@ Klikk på "Lisens"-knappen for fleire opplysningar. Copyright 2002-2014 - Copyright 2002-2014 + Copyright 2002-2014 + + + Copyright 2002-2018 + Copyright 2002-2018 diff --git a/rdadmin/rdadmin_pt_BR.ts b/rdadmin/rdadmin_pt_BR.ts index 589f28b5..89c10f70 100644 --- a/rdadmin/rdadmin_pt_BR.ts +++ b/rdadmin/rdadmin_pt_BR.ts @@ -4358,7 +4358,11 @@ FINALIDADE PARTICULAR. Aperte o botão VER LICENÇA para mais detalhes. Copyright 2002-2014 - Copyright 2002-2009 {2002-2014?} + Copyright 2002-2009 {2002-2014?} + + + Copyright 2002-2018 + Copyright 2002-2009 {2002-2018?} From 8015f824790f718a517f9f240feeae4a9af009a3 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 20 Mar 2018 11:14:48 -0400 Subject: [PATCH 8/9] 2018-03-20 Fred Gleason * Updated 'NEWS'. * Incremented the package version to 2.19.0int01. --- ChangeLog | 3 +++ NEWS | 9 ++++++++- PACKAGE_VERSION | 2 +- rivendell.ism | Bin 499284 -> 499284 bytes 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index c7336b20..205820ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16625,3 +16625,6 @@ * Removed event checks when update Playout events in rdcatch(1). 2018-03-20 Fred Gleason * Updated the date in the copyright notice in rdadmin(1). +2018-03-20 Fred Gleason + * Updated 'NEWS'. + * Incremented the package version to 2.19.0int01. diff --git a/NEWS b/NEWS index 2941e472..0965eb8d 100644 --- a/NEWS +++ b/NEWS @@ -1,12 +1,19 @@ The NEWS file for the Rivendell package. ------------------------------------------------------------------------------- -v2.19.1int00 -- 3/19/2018 +v2.19.1int01 -- 3/20/2018 Changes: HPI Support. Implemented support for DMA bus-mastering in the AudioScience HPI driver. + RDHpiInfo. Removed rdhpiinfo(8). Replaced by the stand-alone 'hpiinfo' + package. + + RDCatch Play Events. Removed the event time check for Playout events in + rdcatch(1), as there is no sane way to determine a 'free' playout time + in the face of shifting cut lengths. + RDLogManager. Fixed a bug in rdlogmanager(1) that caused DB corruption when a clock was deleted while still being assigned to a grid. diff --git a/PACKAGE_VERSION b/PACKAGE_VERSION index 444ccca6..35288642 100644 --- a/PACKAGE_VERSION +++ b/PACKAGE_VERSION @@ -1 +1 @@ -2.19.0int00 \ No newline at end of file +2.19.0int01 \ No newline at end of file diff --git a/rivendell.ism b/rivendell.ism index 770b0274eee91ac09f0b4b6d2bb4472a523a2f14..632f78af9ec7233c220888f750331e0f988d92eb 100644 GIT binary patch delta 16915 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 ql27cL Date: Tue, 27 Mar 2018 11:47:21 -0400 Subject: [PATCH 9/9] 2018-03-28 Fred Gleason * Updated 'NEWS'. * Incremented the package version to 2.19.1. --- ChangeLog | 3 +++ NEWS | 10 +++++----- PACKAGE_VERSION | 2 +- rivendell.ism | Bin 499284 -> 499284 bytes 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 205820ae..fdfbd204 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16628,3 +16628,6 @@ 2018-03-20 Fred Gleason * Updated 'NEWS'. * Incremented the package version to 2.19.0int01. +2018-03-28 Fred Gleason + * Updated 'NEWS'. + * Incremented the package version to 2.19.1. diff --git a/NEWS b/NEWS index 0965eb8d..e42ab1df 100644 --- a/NEWS +++ b/NEWS @@ -1,18 +1,18 @@ The NEWS file for the Rivendell package. ------------------------------------------------------------------------------- -v2.19.1int01 -- 3/20/2018 +v2.19.1 -- 3/27/2018 Changes: - HPI Support. Implemented support for DMA bus-mastering in the AudioScience - HPI driver. + HPI Support. Implemented support for DMA bus-mastering for AudioScience + HPI devices. RDHpiInfo. Removed rdhpiinfo(8). Replaced by the stand-alone 'hpiinfo' package. RDCatch Play Events. Removed the event time check for Playout events in - rdcatch(1), as there is no sane way to determine a 'free' playout time - in the face of shifting cut lengths. + rdcatch(1), as there is no sane way to determine a consistently 'free' + playout time in the face of shifting cut lengths. RDLogManager. Fixed a bug in rdlogmanager(1) that caused DB corruption when a clock was deleted while still being assigned to a grid. diff --git a/PACKAGE_VERSION b/PACKAGE_VERSION index 35288642..7965242b 100644 --- a/PACKAGE_VERSION +++ b/PACKAGE_VERSION @@ -1 +1 @@ -2.19.0int01 \ No newline at end of file +2.19.1 \ No newline at end of file diff --git a/rivendell.ism b/rivendell.ism index 632f78af9ec7233c220888f750331e0f988d92eb..9d7d3bdf116c1e4c1b37b6f1f8ded9207cda7e74 100644 GIT binary patch delta 18532 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 RA$PB?KV+TIwYORs{}0GwIuQT>