diff --git a/ChangeLog b/ChangeLog index 429d9f2c..40b1b3e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14873,8 +14873,3 @@ 'rdadmin/edit_rdlogedit.cpp' and 'rdadmin/edit_rdlogedit.h'. * Added PCM24 support for voice tracking in 'rdlogedit/voice_tracker.cpp'. -2015-09-05 Fred Gleason - * Refactored caed(8) to use virtual inheritance for audio - subsystem drivers. - * Reimplemented the HPI driver in 'cae/driver_hpi.cpp' and - 'cae/driver_hpi.h'. diff --git a/cae/Makefile.am b/cae/Makefile.am index f6cb5ef2..48ed5aed 100644 --- a/cae/Makefile.am +++ b/cae/Makefile.am @@ -2,7 +2,9 @@ ## ## Core Audio Engine Makefile.am for Rivendell ## -## Copyright 2002-2015 Fred Gleason +## Copyright 2002-2006 Fred Gleason +## +## $Id: Makefile.am,v 1.33.8.1 2012/11/29 01:37:34 cvs Exp $ ## ## 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 @@ -30,18 +32,13 @@ moc_%.cpp: %.h bin_PROGRAMS = caed dist_caed_SOURCES = cae.cpp cae.h\ -## cae_alsa.cpp\ -## cae_hpi.cpp\ -## cae_jack.cpp\ - cae_socket.cpp cae_socket.h\ - driver.cpp driver.h\ - driver_hpi.cpp driver_hpi.h\ - driverfactory.cpp driverfactory.h + cae_alsa.cpp\ + cae_hpi.cpp\ + cae_jack.cpp\ + cae_socket.cpp cae_socket.h nodist_caed_SOURCES = moc_cae.cpp\ - moc_cae_socket.cpp\ - moc_driver.cpp\ - moc_driver_hpi.cpp + moc_cae_socket.cpp caed_LDADD = @LIB_RDLIBS@\ @LIBALSA@\ diff --git a/cae/cae.cpp b/cae/cae.cpp index 8bf62fd3..60af0186 100644 --- a/cae/cae.cpp +++ b/cae/cae.cpp @@ -46,17 +46,15 @@ #include #include -#include "cae_socket.h" -#include "cae.h" -#include "driverfactory.h" +#include +#include volatile bool exiting=false; RDConfig *rd_config; -/* #ifdef JACK extern jack_client_t *jack_client; #endif // JACK -*/ + #define PRINT_COMMANDS void LogLine(RDConfig::LogPriority prio,const QString &line) @@ -154,7 +152,7 @@ MainObject::MainObject(QObject *parent,const char *name) auth[i]=false; } for(int i=0;iok()) { LogLine(RDConfig::LogErr,"ERROR caed aborting - CaeSocket() server not ok"); @@ -232,37 +229,11 @@ MainObject::MainObject(QObject *parent,const char *name) RDSystem *sys=new RDSystem(); system_sample_rate=sys->sampleRate(); delete sys; - - /* hpiInit(station); alsaInit(station); jackInit(station); - */ ClearDriverEntries(station); - // - // Start HPI - // - Driver *dvr=DriverFactory(Driver::Hpi,station,rd_config,this); - if(dvr!=NULL) { - connect(dvr,SIGNAL(playStateChanged(int,int,int)), - this,SLOT(statePlayUpdate(int,int,int))); - connect(dvr,SIGNAL(recordStateChanged(int,int,int)), - this,SLOT(stateRecordUpdate(int,int,int))); - int n=dvr->start(cae_drivers.size()); - for(int i=0;isetCardDriver(i,RDStation::Hpi); - station->setCardName(i,dvr->cardName(i)); - station->setCardInputs(i,dvr->inputs(i)); - station->setCardOutputs(i,dvr->outputs(i)); - } - } - - // - // FIXME: JACK and ALSA startups go here... - // - // // Probe Capabilities // @@ -295,7 +266,6 @@ MainObject::MainObject(QObject *parent,const char *name) struct sched_param sched_params; int result = 0; memset(&sched_params,0,sizeof(struct sched_param)); - /* #ifdef JACK if(jack_client!=NULL) { pthread_getschedparam(jack_client_thread_id(jack_client),&sched_policy, @@ -323,13 +293,11 @@ MainObject::MainObject(QObject *parent,const char *name) jack_running=true; } #endif // JACK - */ if(rd_config->useRealtime()) { if(!jack_running) { sched_params.sched_priority=rd_config->realtimePriority(); } sched_policy=SCHED_FIFO; - /* #ifdef ALSA for(int i=0;isched_get_priority_min(sched_policy)) { sched_params.sched_priority--; } @@ -488,59 +455,131 @@ void MainObject::updateMeters() unsigned positions[RD_MAX_STREAMS]; if(exiting) { - for(unsigned i=0;igetInputStatus(i,j)!=port_status[i][j]) { - port_status[i][j]=dvr->getInputStatus(i,j); - if(port_status[i][j]) { - BroadcastCommand(QString().sprintf("IS %d %d 0!",i,j)); - } - else { - BroadcastCommand(QString().sprintf("IS %d %d 1!",i,j)); - } - } - if(dvr->getInputMeters(i,j,levels)) { - SendMeterLevelUpdate("I",i,j,levels); - } - if(dvr->getOutputMeters(i,j,levels)) { - SendMeterLevelUpdate("O",i,j,levels); - } - } - dvr->getOutputPosition(i,positions); - SendMeterPositionUpdate(i,positions); - for(int j=0;jgetStreamOutputMeters(i,j,levels)) { - SendStreamMeterLevelUpdate(i,j,levels); - } + + for(int i=0;isetPassthroughLevel(i,j,k,RD_MUTE_DEPTH); - } + for(int i=0;i=(int)cae_drivers.size())) { + if(card<0) { sprintf(temp,"LP %d %s -1 -1 -!",card,args[ch][2]); EchoCommand(ch,temp); return; } wavename = rd_config->audioFileName (QString(args[ch][2])); - if(!cae_drivers[card]->loadPlayback(card,wavename,&new_stream)) { - sprintf(temp,"LP %d %s -1 -1 -!",card,args[ch][2]); - EchoCommand(ch,temp); - LogLine(RDConfig::LogErr, - QString().sprintf("unable to allocate stream for card %d", - card)); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiLoadPlayback(card,wavename,&new_stream)) { + sprintf(temp,"LP %d %s -1 -1 -!",card,args[ch][2]); + EchoCommand(ch,temp); + LogLine(RDConfig::LogErr, + QString().sprintf("unable to allocate stream for card %d", + card)); + return; + } + break; + + case RDStation::Alsa: + if(!alsaLoadPlayback(card,wavename,&new_stream)) { + sprintf(temp,"LP %d %s -1 -1 -!",card,args[ch][2]); + EchoCommand(ch,temp); + LogLine(RDConfig::LogErr,QString(). + sprintf("unable to allocate stream for card %d", + card)); + return; + } + break; + + case RDStation::Jack: + if(!jackLoadPlayback(card,wavename,&new_stream)) { + sprintf(temp,"LP %d %s -1 -1 -!",card,args[ch][2]); + EchoCommand(ch,temp); + LogLine(RDConfig::LogErr,QString(). + sprintf("unable to allocate stream for card %d", + card)); + return; + } + break; + + default: + sprintf(temp,"LP %d %s -1 -1 -!",card,args[ch][2]); + EchoCommand(ch,temp); + return; } if((handle=GetHandle(card,new_stream))>=0) { LogLine(RDConfig::LogErr,QString(). @@ -712,15 +782,49 @@ void MainObject::DispatchCommand(int ch) card=play_handle[handle].card; stream=play_handle[handle].stream; if((play_owner[card][stream]==-1)||(play_owner[card][stream]==ch)) { - if(cae_drivers[card]->unloadPlayback(card,stream)) { - play_owner[card][stream]=-1; - LogLine(RDConfig::LogInfo,QString(). - sprintf("UnloadPlayback - Card: %d Stream: %d Handle: %d", - card,stream,handle)); - EchoArgs(ch,'+'); - } - else { - EchoArgs(ch,'-'); + switch(cae_driver[card]) { + case RDStation::Hpi: + if(hpiUnloadPlayback(card,stream)) { + play_owner[card][stream]=-1; + LogLine(RDConfig::LogInfo,QString(). + sprintf("UnloadPlayback - Card: %d Stream: %d Handle: %d", + card,stream,handle)); + EchoArgs(ch,'+'); + } + else { + EchoArgs(ch,'-'); + } + break; + + case RDStation::Alsa: + if(alsaUnloadPlayback(card,stream)) { + play_owner[card][stream]=-1; + LogLine(RDConfig::LogInfo,QString(). + sprintf("UnloadPlayback - Card: %d Stream: %d Handle: %d", + card,stream,handle)); + EchoArgs(ch,'+'); + } + else { + EchoArgs(ch,'-'); + } + break; + + case RDStation::Jack: + if(jackUnloadPlayback(card,stream)) { + play_owner[card][stream]=-1; + LogLine(RDConfig::LogInfo,QString(). + sprintf("UnloadPlayback - Card: %d Stream: %d Handle: %d", + card,stream,handle)); + EchoArgs(ch,'+'); + } + else { + EchoArgs(ch,'-'); + } + break; + + default: + EchoArgs(ch,'-'); + return; } play_handle[handle].card=-1; play_handle[handle].stream=-1; @@ -744,17 +848,49 @@ void MainObject::DispatchCommand(int ch) EchoArgs(ch,'-'); return; } - if(cae_drivers[card]->playbackPosition(card,stream,pos)) { - LogLine(RDConfig::LogInfo,QString(). - sprintf("PlaybackPosition - Card: %d Stream: %d Pos: %d Handle: %d", - card,stream,pos,handle)); - EchoArgs(ch,'+'); - } - else { - LogLine(RDConfig::LogNotice,QString(). - sprintf("*** PlaybackPosition out of bounds - Card: %d Stream: %d Pos: %d Handle: %d***", - card,stream,pos,handle)); - EchoArgs(ch,'-'); + switch(cae_driver[card]) { + case RDStation::Hpi: + if(hpiPlaybackPosition(card,stream,pos)) { + LogLine(RDConfig::LogInfo,QString(). + sprintf("PlaybackPosition - Card: %d Stream: %d Pos: %d Handle: %d", + card,stream,pos,handle)); + EchoArgs(ch,'+'); + } + else { + LogLine(RDConfig::LogNotice,QString(). + sprintf("*** PlaybackPosition out of bounds - Card: %d Stream: %d Pos: %d Handle: %d***", + card,stream,pos,handle)); + EchoArgs(ch,'-'); + } + break; + + case RDStation::Alsa: + if(alsaPlaybackPosition(card,stream,pos)) { + LogLine(RDConfig::LogInfo,QString(). + sprintf("PlaybackPosition - Card: %d Stream: %d Pos: %d Handle: %d", + card,stream,pos,handle)); + EchoArgs(ch,'+'); + } + else { + EchoArgs(ch,'-'); + } + break; + + case RDStation::Jack: + if(jackPlaybackPosition(card,stream,pos)) { + LogLine(RDConfig::LogInfo,QString(). + sprintf("PlaybackPosition - Card: %d Stream: %d Pos: %d Handle: %d", + card,stream,pos,handle)); + EchoArgs(ch,'+'); + } + else { + EchoArgs(ch,'-'); + } + break; + + default: + EchoArgs(ch,'-'); + return; } return; } @@ -793,12 +929,37 @@ void MainObject::DispatchCommand(int ch) return; } if(play_owner[card][stream]==ch) { - if(!cae_drivers[card]->play(card,stream,play_length[card][stream], - play_speed[card][stream], - play_pitch[card][stream], - RD_ALLOW_NONSTANDARD_RATES)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiPlay(card,stream,play_length[card][stream], + play_speed[card][stream],play_pitch[card][stream], + RD_ALLOW_NONSTANDARD_RATES)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaPlay(card,stream,play_length[card][stream], + play_speed[card][stream],play_pitch[card][stream], + RD_ALLOW_NONSTANDARD_RATES)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackPlay(card,stream,play_length[card][stream], + play_speed[card][stream],play_pitch[card][stream], + RD_ALLOW_NONSTANDARD_RATES)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } LogLine(RDConfig::LogInfo,QString(). sprintf("Play - Card: %d Stream: %d Handle: %d Length: %d Speed: %d Pitch: %d", @@ -819,9 +980,31 @@ void MainObject::DispatchCommand(int ch) card=play_handle[handle].card; stream=play_handle[handle].stream; if(play_owner[card][stream]==ch) { - if(!cae_drivers[card]->stopPlayback(card,stream)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiStopPlayback(card,stream)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaStopPlayback(card,stream)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackStopPlayback(card,stream)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } LogLine(RDConfig::LogInfo,QString(). sprintf("StopPlayback - Card: %d Stream: %d Handle: %d", @@ -833,17 +1016,39 @@ void MainObject::DispatchCommand(int ch) return; } - if((!strcmp(args[ch][0],"TS"))&&(card<(int)cae_drivers.size())) { // Timescale Support - if(!cae_drivers[card]->timescaleSupported(card)) { - EchoArgs(ch,'-'); - return; + if(!strcmp(args[ch][0],"TS")) { // Timescale Support + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiTimescaleSupported(card)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackTimescaleSupported(card)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaTimescaleSupported(card)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } EchoArgs(ch,'+'); return; } if(!strcmp(args[ch][0],"LR")) { // Load Record - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } @@ -867,10 +1072,34 @@ void MainObject::DispatchCommand(int ch) wavename = rd_config->audioFileName(QString(args[ch][7])); unlink(wavename); // So we don't trainwreck any current playouts! unlink(wavename+".energy"); - if(!cae_drivers[card]->loadRecord(card,stream,coding,channels, - sample_rate,bit_rate,wavename)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiLoadRecord(card,stream,coding,channels,sample_rate,bit_rate, + wavename)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaLoadRecord(card,stream,coding,channels,sample_rate, + bit_rate,wavename)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackLoadRecord(card,stream,coding,channels,sample_rate, + bit_rate,wavename)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } LogLine(RDConfig::LogInfo,QString(). sprintf("LoadRecord - Card: %d Stream: %d Coding: %d Chans: %d SampRate: %d BitRate: %d Name: %s", @@ -886,15 +1115,37 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"UR")) { // Unload Record - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } if((record_owner[card][stream]==-1)||(record_owner[card][stream]==ch)) { unsigned len=0; - if(!cae_drivers[card]->unloadRecord(card,stream,&len)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiUnloadRecord(card,stream,&len)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaUnloadRecord(card,stream,&len)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackUnloadRecord(card,stream,&len)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } record_owner[card][stream]=-1; LogLine(RDConfig::LogInfo,QString(). @@ -912,7 +1163,7 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"RD")) { // Record - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } @@ -925,15 +1176,40 @@ void MainObject::DispatchCommand(int ch) return; } if(record_owner[card][stream]==ch) { - if(!cae_drivers[card]->record(card,stream,record_length[card][stream], - record_threshold[card][stream])) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiRecord(card,stream,record_length[card][stream], + record_threshold[card][stream])) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaRecord(card,stream,record_length[card][stream], + record_threshold[card][stream])) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackRecord(card,stream,record_length[card][stream], + record_threshold[card][stream])) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } LogLine(RDConfig::LogInfo,QString(). sprintf("Record - Card: %d Stream: %d Length: %d Thres: %d", card,stream,record_length[card][stream], record_threshold[card][stream])); +// EchoArgs(ch,'+'); return; } EchoArgs(ch,'-'); @@ -941,13 +1217,37 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"SR")) { // Stop Record - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->stopRecord(card,stream)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiStopRecord(card,stream)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaStopRecord(card,stream)) { + EchoArgs(ch,'-'); + return; + } + EchoArgs(ch,'+'); + break; + + case RDStation::Jack: + if(!jackStopRecord(card,stream)) { + EchoArgs(ch,'-'); + return; + } + EchoArgs(ch,'+'); + break; + + default: + EchoArgs(ch,'-'); + return; } LogLine(RDConfig::LogInfo,QString(). sprintf("StopRecord - Card: %d Stream: %d", @@ -956,13 +1256,20 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"CS")) { // Set Clock Source - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->setClockSource(card,stream)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetClockSource(card,stream)) { + EchoArgs(ch,'-'); + return; + } + + default: + EchoArgs(ch,'+'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -973,14 +1280,33 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"IV")) { // Set Input Volume - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } sscanf(args[ch][3],"%d",&level); - if(!cae_drivers[card]->setInputVolume(card,stream,level)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetInputVolume(card,stream,level)) { + EchoArgs(ch,'-'); + return; + } + + case RDStation::Alsa: + if(!alsaSetInputVolume(card,stream,level)) { + EchoArgs(ch,'-'); + return; + } + + case RDStation::Jack: + if(!jackSetInputVolume(card,stream,level)) { + EchoArgs(ch,'-'); + return; + } + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -992,15 +1318,37 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"OV")) { // Set Output Volume - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } sscanf(args[ch][3],"%d",&port); sscanf(args[ch][4],"%d",&level); - if(!cae_drivers[card]->setOutputVolume(card,stream,port,level)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetOutputVolume(card,stream,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetOutputVolume(card,stream,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetOutputVolume(card,stream,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1012,16 +1360,38 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"FV")) { // Fade Output Volume - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } sscanf(args[ch][3],"%d",&port); sscanf(args[ch][4],"%d",&level); sscanf(args[ch][5],"%d",&length); - if(!cae_drivers[card]->fadeOutputVolume(card,stream,port,level,length)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiFadeOutputVolume(card,stream,port,level,length)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaFadeOutputVolume(card,stream,port,level,length)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackFadeOutputVolume(card,stream,port,level,length)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1035,13 +1405,35 @@ void MainObject::DispatchCommand(int ch) if(!strcmp(args[ch][0],"IL")) { // Set Input Level sscanf(args[ch][2],"%d",&port); sscanf(args[ch][3],"%d",&level); - if((card<0)||(card>=(int)cae_drivers.size())||(port<0)) { + if((card<0)||(port<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->setInputLevel(card,port,level)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetInputLevel(card,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetInputLevel(card,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetInputLevel(card,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1055,13 +1447,35 @@ void MainObject::DispatchCommand(int ch) if(!strcmp(args[ch][0],"OL")) { // Set Output Level sscanf(args[ch][2],"%d",&port); sscanf(args[ch][3],"%d",&level); - if((card<0)||(card>=(int)cae_drivers.size())||(port<0)) { + if((card<0)||(port<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->setOutputLevel(card,port,level)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetOutputLevel(card,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetOutputLevel(card,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetOutputLevel(card,port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1075,13 +1489,35 @@ void MainObject::DispatchCommand(int ch) if(!strcmp(args[ch][0],"IM")) { // Set Input Mode sscanf(args[ch][2],"%d",&port); sscanf(args[ch][3],"%d",&mode); - if((card<0)||(card>=(int)cae_drivers.size())||(port<0)) { + if((card<0)||(port<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->setInputMode(card,port,mode)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetInputMode(card,port,mode)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetInputMode(card,port,mode)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetInputMode(card,port,mode)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1095,13 +1531,35 @@ void MainObject::DispatchCommand(int ch) if(!strcmp(args[ch][0],"OM")) { // Set Output Mode sscanf(args[ch][2],"%d",&port); sscanf(args[ch][3],"%d",&mode); - if((card<0)||(card>=(int)cae_drivers.size())||(port<0)) { + if((card<0)||(port<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->setOutputMode(card,port,mode)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetOutputMode(card,port,mode)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetOutputMode(card,port,mode)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetOutputMode(card,port,mode)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1113,14 +1571,36 @@ void MainObject::DispatchCommand(int ch) } if(!strcmp(args[ch][0],"IX")) { // Set Input VOX Level - if((card<0)||(card>=(int)cae_drivers.size())||(stream<0)) { + if((card<0)||(stream<0)) { EchoArgs(ch,'-'); return; } sscanf(args[ch][3],"%d",&level); - if(!cae_drivers[card]->setInputVoxLevel(card,stream,level)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetInputVoxLevel(card,stream,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetInputVoxLevel(card,stream,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetInputVoxLevel(card,stream,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1134,13 +1614,35 @@ void MainObject::DispatchCommand(int ch) if(!strcmp(args[ch][0],"IT")) { // Set Input Type sscanf(args[ch][2],"%d",&port); sscanf(args[ch][3],"%d",&type); - if((card<0)||(card>=(int)cae_drivers.size())||(port<0)) { + if((card<0)||(port<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->setInputType(card,port,type)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetInputType(card,port,type)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetInputType(card,port,type)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetInputType(card,port,type)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1155,13 +1657,35 @@ void MainObject::DispatchCommand(int ch) sscanf(args[ch][2],"%d",&in_port); sscanf(args[ch][3],"%d",&out_port); sscanf(args[ch][4],"%d",&level); - if((card<0)||(card>=(int)cae_drivers.size())||(in_port<0)||(out_port<0)) { + if((card<0)||(in_port<0)||(out_port<0)) { EchoArgs(ch,'-'); return; } - if(!cae_drivers[card]->setPassthroughLevel(card,in_port,out_port,level)) { - EchoArgs(ch,'-'); - return; + switch(cae_driver[card]) { + case RDStation::Hpi: + if(!hpiSetPassthroughLevel(card,in_port,out_port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Alsa: + if(!alsaSetPassthroughLevel(card,in_port,out_port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + case RDStation::Jack: + if(!jackSetPassthroughLevel(card,in_port,out_port,level)) { + EchoArgs(ch,'-'); + return; + } + break; + + default: + EchoArgs(ch,'-'); + return; } if(rd_config->enableMixerLogging()) { LogLine(RDConfig::LogInfo,QString(). @@ -1174,11 +1698,11 @@ void MainObject::DispatchCommand(int ch) if(!strcmp(args[ch][0],"IS")) { // Input Status sscanf(args[ch][2],"%d",&port); - if((card<0)||(card>=(int)cae_drivers.size())||(port<0)) { + if((card<0)||(port<0)) { EchoArgs(ch,'-'); return; } - if(cae_drivers[card]->getInputStatus(card,port)) { + if(hpiGetInputStatus(card,port)) { EchoCommand(ch,QString().sprintf("IS %d %d 0 +!",card,port)); } else { @@ -1189,7 +1713,6 @@ void MainObject::DispatchCommand(int ch) if(!strcmp(args[ch][0],"ME")) { // Meter Enable sscanf(args[ch][1],"%d",&port); - printf("port: %u\n",0xFFFF&port); if((port<0)||(port>0xFFFF)) { EchoArgs(ch,'-'); return; @@ -1204,7 +1727,7 @@ void MainObject::DispatchCommand(int ch) sscanf(args[ch][1],"%d",&card); sscanf(args[ch][2],"%d",&port); sscanf(args[ch][3],"%d",&stream); - if((card<0)||(card>=(int)cae_drivers.size())|| + if((card<0)||(card>=RD_MAX_CARDS)|| (port<0)||(port>=RD_MAX_PORTS)|| (stream<0)||(stream>=RD_MAX_STREAMS)) { EchoArgs(ch,'-'); @@ -1236,7 +1759,7 @@ void MainObject::DispatchCommand(int ch) in_jport+=" "; } in_jport=in_jport.left(in_jport.length()-1); - cae_drivers[card]->connectPorts(out_jport,in_jport); + jackConnectPorts(out_jport,in_jport); } if(!strcmp(args[ch][0],"JD")) { // Disconnect JACK Ports @@ -1259,7 +1782,7 @@ void MainObject::DispatchCommand(int ch) in_jport+=" "; } in_jport=in_jport.left(in_jport.length()-1); - cae_drivers[card]->disconnectPorts(out_jport,in_jport); + jackDisconnectPorts(out_jport,in_jport); } } @@ -1271,17 +1794,48 @@ void MainObject::KillSocket(int ch) argptr[ch]=0; auth[ch]=false; meter_port[ch]=0; - for(unsigned i=0;iunloadRecord(i,j,&len); + switch(cae_driver[i]) { + case RDStation::Hpi: + hpiUnloadRecord(i,j,&len); + break; + + case RDStation::Jack: + jackUnloadRecord(i,j,&len); + break; + + case RDStation::Alsa: + alsaUnloadRecord(i,j,&len); + break; + + default: + LogLine(RDConfig::LogNotice,"tried to kill unowned socket!"); + break; + } record_length[i][j]=0; record_threshold[i][j]=-10000; record_owner[i][j]=-1; } if(play_owner[i][j]==ch) { - cae_drivers[i]->unloadPlayback(i,j); + switch(cae_driver[i]) { + case RDStation::Hpi: + hpiUnloadPlayback(i,j); + break; + + case RDStation::Jack: + jackUnloadPlayback(i,j); + break; + + case RDStation::Alsa: + alsaUnloadPlayback(i,j); + break; + + case RDStation::None: + break; + } play_owner[i][j]=-1; play_length[i][j]=0; play_speed[i][j]=100; @@ -1435,13 +1989,11 @@ void MainObject::ProbeCaps(RDStation *station) station->setHaveCapability(RDStation::HaveTwoLame,LoadTwoLame()); station->setHaveCapability(RDStation::HaveMpg321,LoadMad()); - /* #ifdef HPI station->setDriverVersion(RDStation::Hpi,hpiVersion()); #else station->setDriverVersion(RDStation::Hpi,"[not enabled]"); #endif // HPI - #ifdef JACK // // FIXME: How can we detect the current JACK version? @@ -1459,17 +2011,18 @@ void MainObject::ProbeCaps(RDStation *station) #else station->setDriverVersion(RDStation::Alsa,""); #endif // ALSA - */ } void MainObject::ClearDriverEntries(RDStation *station) { for(int i=0;isetCardDriver(i,RDStation::None); - station->setCardName(i,""); - station->setCardInputs(i,-1); - station->setCardOutputs(i,-1); + if(cae_driver[i]==RDStation::None) { + station->setCardDriver(i,RDStation::None); + station->setCardName(i,""); + station->setCardInputs(i,-1); + station->setCardOutputs(i,-1); + } } } @@ -1678,10 +2231,12 @@ void MainObject::SendMeterPositionUpdate(int cardnum,unsigned pos[]) void MainObject::SendMeterOutputStatusUpdate() { - for(unsigned i=0;i +// (C) Copyright 2002-2004 Fred Gleason +// +// $Id: cae.h,v 1.79.4.4 2012/11/30 16:14:58 cvs Exp $ // // 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 @@ -26,8 +28,6 @@ #include #include -#include - #include #include @@ -40,7 +40,7 @@ #include #include -/* + #ifdef HPI #include #include @@ -69,7 +69,7 @@ struct alsa_format { #ifdef JACK #include #endif // JACK -*/ + #ifdef HAVE_TWOLAME #include #endif // HAVE_TWOLAME @@ -81,8 +81,6 @@ struct alsa_format { #include #include -#include "driver.h" - // // Debug Options // @@ -153,7 +151,7 @@ class MainObject : public QObject int argnum[CAE_MAX_CONNECTIONS]; int argptr[CAE_MAX_CONNECTIONS]; bool auth[CAE_MAX_CONNECTIONS]; - // RDStation::AudioDriver cae_driver[RD_MAX_CARDS]; + RDStation::AudioDriver cae_driver[RD_MAX_CARDS]; int record_owner[RD_MAX_CARDS][RD_MAX_STREAMS]; int record_length[RD_MAX_CARDS][RD_MAX_STREAMS]; int record_threshold[RD_MAX_CARDS][RD_MAX_STREAMS]; @@ -169,12 +167,51 @@ class MainObject : public QObject int owner; } play_handle[256]; int next_play_handle; - std::vector cae_drivers; + + // + // HPI Driver + // + private: + void hpiInit(RDStation *station); + void hpiFree(); + QString hpiVersion(); + bool hpiLoadPlayback(int card,QString wavename,int *stream); + bool hpiUnloadPlayback(int card,int stream); + bool hpiPlaybackPosition(int card,int stream,unsigned pos); + bool hpiPlay(int card,int stream,int length,int speed,bool pitch, + bool rates); + bool hpiStopPlayback(int card,int stream); + bool hpiTimescaleSupported(int card); + bool hpiLoadRecord(int card,int port,int coding,int chans,int samprate, + int bitrate,QString wavename); + bool hpiUnloadRecord(int card,int stream,unsigned *len); + bool hpiRecord(int card,int stream,int length,int thres); + bool hpiStopRecord(int card,int stream); + bool hpiSetClockSource(int card,int src); + bool hpiSetInputVolume(int card,int stream,int level); + bool hpiSetOutputVolume(int card,int stream,int port,int level); + bool hpiFadeOutputVolume(int card,int stream,int port,int level,int length); + bool hpiSetInputLevel(int card,int port,int level); + bool hpiSetOutputLevel(int card,int port,int level); + bool hpiSetInputMode(int card,int stream,int mode); + bool hpiSetOutputMode(int card,int stream,int mode); + bool hpiSetInputVoxLevel(int card,int stream,int level); + bool hpiSetInputType(int card,int port,int type); + bool hpiGetInputStatus(int card,int port); + bool hpiGetInputMeters(int card,int port,short levels[2]); + bool hpiGetOutputMeters(int card,int port,short levels[2]); + bool hpiGetStreamOutputMeters(int card,int stream,short levels[2]); + bool hpiSetPassthroughLevel(int card,int in_port,int out_port,int level); + void hpiGetOutputPosition(int card,unsigned *pos); +#ifdef HPI + RDHPISoundCard *sound_card; + RDHPIRecordStream *record[RD_MAX_CARDS][RD_MAX_STREAMS]; + RDHPIPlayStream *play[RD_MAX_CARDS][RD_MAX_STREAMS]; +#endif // HPI // // JACK Driver // - /* private slots: void jackStopTimerData(int stream); void jackFadeTimerData(int stream); @@ -248,11 +285,10 @@ class MainObject : public QObject int jack_clock_phase; unsigned jack_samples_recorded[RD_MAX_STREAMS]; #endif // JACK - */ + // // ALSA Driver // - /* private slots: void alsaStopTimerData(int cardstream); void alsaFadeTimerData(int cardstream); @@ -304,7 +340,6 @@ class MainObject : public QObject short alsa_output_volume_db[RD_MAX_CARDS][RD_MAX_PORTS][RD_MAX_STREAMS]; short alsa_passthrough_volume_db[RD_MAX_CARDS][RD_MAX_PORTS][RD_MAX_PORTS]; short *alsa_wave_buffer; - uint8_t *alsa_wave24_buffer; RDWaveFile *alsa_record_wave[RD_MAX_CARDS][RD_MAX_STREAMS]; RDWaveFile *alsa_play_wave[RD_MAX_CARDS][RD_MAX_STREAMS]; int alsa_offset[RD_MAX_CARDS][RD_MAX_STREAMS]; @@ -317,7 +352,7 @@ class MainObject : public QObject int alsa_fade_port[RD_MAX_CARDS][RD_MAX_STREAMS]; unsigned alsa_samples_recorded[RD_MAX_CARDS][RD_MAX_STREAMS]; #endif // ALSA - */ + bool CheckLame(); // diff --git a/cae/cae_alsa.cpp b/cae/cae_alsa.cpp index cceffa53..818c2853 100644 --- a/cae/cae_alsa.cpp +++ b/cae/cae_alsa.cpp @@ -2,7 +2,9 @@ // // The ALSA Driver for the Core Audio Engine component of Rivendell // -// (C) Copyright 2002-2015 Fred Gleason +// (C) Copyright 2002-2004 Fred Gleason +// +// $Id: cae_alsa.cpp,v 1.48.6.5 2013/06/26 23:18:40 cvs Exp $ // // 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 @@ -17,7 +19,7 @@ // License along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -/* + #include #include @@ -715,7 +717,6 @@ void MainObject::alsaInit(RDStation *station) // AlsaInitCallback(); alsa_wave_buffer=new int16_t[RINGBUFFER_SIZE]; - alsa_wave24_buffer=new uint8_t[RINGBUFFER_SIZE]; //alsa_resample_buffer=new int16_t[2*RINGBUFFER_SIZE]; // @@ -1526,11 +1527,11 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm) // Start the Callback // pthread_attr_init(&pthread_attr); - -// if(use_realtime) { -// pthread_attr_setschedpolicy(&pthread_attr,SCHED_FIFO); -// } - +/* + if(use_realtime) { + pthread_attr_setschedpolicy(&pthread_attr,SCHED_FIFO); + } +*/ alsa_capture_format[card].exiting = false; pthread_create(&alsa_capture_format[card].thread,&pthread_attr, AlsaCaptureCallback,&alsa_capture_format[card]); @@ -1681,11 +1682,11 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm) // Start the Callback // pthread_attr_init(&pthread_attr); - -// if(use_realtime) { -// pthread_attr_setschedpolicy(&pthread_attr,SCHED_FIFO); -// } - + /* + if(use_realtime) { + pthread_attr_setschedpolicy(&pthread_attr,SCHED_FIFO); + } + */ alsa_play_format[card].exiting = false; pthread_create(&alsa_play_format[card].thread,&pthread_attr, AlsaPlayCallback,&alsa_play_format[card]); @@ -1775,34 +1776,6 @@ void MainObject::FillAlsaOutputStream(int card,int stream) (double)alsa_play_wave[card][stream]->getSamplesPerSec(); switch(alsa_play_wave[card][stream]->getFormatTag()) { case WAVE_FORMAT_PCM: - switch(alsa_play_wave[card][stream]->getBitsPerSample()) { - case 16: // PCM16 - free=(int)((double)free/ratio)/(2*alsa_output_channels[card][stream])* - (2*alsa_output_channels[card][stream]); - n=alsa_play_wave[card][stream]->readWave(alsa_wave_buffer,free); - if(n!=free) { - alsa_eof[card][stream]=true; - alsa_stop_timer[card][stream]->stop(); - } - break; - - case 24: // PCM24 - free=(int)((double)free/ratio)/(6*alsa_output_channels[card][stream])* - (6*alsa_output_channels[card][stream]); - n=alsa_play_wave[card][stream]->readWave(alsa_wave24_buffer,free); - for(int i=0;i<(n/3);i++) { - for(int j=0;j<2;j++) { - ((uint8_t *)alsa_wave_buffer)[2*i+j]=alsa_wave24_buffer[3*i+j+1]; - } - } - if(n!=free) { - alsa_eof[card][stream]=true; - alsa_stop_timer[card][stream]->stop(); - } - break; - } - break; - case WAVE_FORMAT_VORBIS: free=(int)((double)free/ratio)/(2*alsa_output_channels[card][stream])* (2*alsa_output_channels[card][stream]); @@ -1907,4 +1880,3 @@ void MainObject::AlsaClock() } #endif // ALSA } -*/ diff --git a/cae/cae_hpi.cpp b/cae/cae_hpi.cpp new file mode 100644 index 00000000..b0135f01 --- /dev/null +++ b/cae/cae_hpi.cpp @@ -0,0 +1,541 @@ +// cae_hpi.cpp +// +// The HPI Driver for the Core Audio Engine component of Rivendell +// +// (C) Copyright 2002-2004 Fred Gleason +// +// $Id: cae_hpi.cpp,v 1.38.6.2 2012/11/30 16:14:58 cvs Exp $ +// +// 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 + +void MainObject::hpiInit(RDStation *station) +{ +#ifdef HPI + for(int i=0;isetFadeProfile(RD_FADE_TYPE); + for(int i=0;igetCardQuantity();i++) { + cae_driver[i]=RDStation::Hpi; + station->setCardDriver(i,RDStation::Hpi); + station->setCardName(i,sound_card->getCardDescription(i)); + station->setCardInputs(i,sound_card->getCardInputPorts(i)); + station->setCardOutputs(i,sound_card->getCardOutputPorts(i)); + } +#endif // HPI +} + + +void MainObject::hpiFree() +{ +#ifdef HPI + +#endif // HPI +} + + +QString MainObject::hpiVersion() +{ +#ifdef HPI + if(sound_card==NULL) { + return QString("not active"); + } + RDHPIInformation *info=sound_card->hpiInformation(0); + if(info->hpiVersion()==0) { + return QString("not active"); + } + return QString().sprintf("%d.%02d.%02d",info->hpiMajorVersion(), + info->hpiMinorVersion(),info->hpiPointVersion()); +#else + return QString("not enabled"); +#endif // HPI +} + + +bool MainObject::hpiLoadPlayback(int card,QString wavename,int *stream) +{ +#ifdef HPI + RDHPIPlayStream *playstream=new RDHPIPlayStream(sound_card); + playstream->setCard(card); + if(playstream->openWave(wavename)!=RDHPIPlayStream::Ok) { + LogLine(RDConfig::LogNotice,QString().sprintf( + "Error: hpiLoadPlayback(%s) openWave() failed to open file", + (const char *) wavename) ); + delete playstream; + return false; + } + *stream=playstream->getStream(); + play[card][*stream]=playstream; + connect(play[card][*stream],SIGNAL(stateChanged(int,int,int)), + this,SLOT(statePlayUpdate(int,int,int))); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiUnloadPlayback(int card,int stream) +{ +#ifdef HPI + if(play[card][stream]==NULL) { + return false; + } + if(play[card][stream]->getState()==RDHPIPlayStream::Playing) { + play[card][stream]->pause(); + } + play[card][stream]->disconnect(); + play[card][stream]->closeWave(); + delete play[card][stream]; + play[card][stream]=NULL; + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiPlaybackPosition(int card,int stream,unsigned pos) +{ +#ifdef HPI + if(play[card][stream]==NULL) { + return false; + } + return play[card][stream]-> + setPosition((unsigned)((double)play[card][stream]->getSamplesPerSec()* + (double)pos/1000.0)); +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiPlay(int card,int stream,int length,int speed,bool pitch, + bool rates) +{ +#ifdef HPI + if(play[card][stream]==NULL) { + return false; + } + if(!play[card][stream]->setSpeed(speed,pitch,rates)) { + return false; + } + play[card][stream]->setPlayLength(length); + return play[card][stream]->play(); +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiStopPlayback(int card,int stream) +{ +#ifdef HPI + if(play[card][stream]==NULL) { + return false; + } + play[card][stream]->pause(); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiTimescaleSupported(int card) +{ +#ifdef HPI + return sound_card->haveTimescaling(card); +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiLoadRecord(int card,int stream,int coding,int chans, + int samprate,int bitrate,QString wavename) +{ +#ifdef HPI + syslog(LOG_NOTICE,"card: %d coding: %d\n",card,coding); + record[card][stream]=new RDHPIRecordStream(sound_card); + connect(record[card][stream],SIGNAL(stateChanged(int,int,int)), + this,SLOT(stateRecordUpdate(int,int,int))); + record[card][stream]->setCard(card); + record[card][stream]->setStream(stream); + record[card][stream]->nameWave(wavename); + record[card][stream]->setChannels(chans); + record[card][stream]->setSamplesPerSec(samprate); + if(coding==0) { // PCM16 + record[card][stream]->setFormatTag(WAVE_FORMAT_PCM); + record[card][stream]->setBitsPerSample(16); + } + if((coding==1)||(coding==2)) { // MPEG-1 + record[card][stream]->setFormatTag(WAVE_FORMAT_MPEG); + record[card][stream]->setHeadLayer(coding); + record[card][stream]->setHeadBitRate(bitrate); + record[card][stream]->setMextChunk(true); + switch(chans) { + case 1: + record[card][stream]->setHeadMode(ACM_MPEG_SINGLECHANNEL); + break; + case 2: + record[card][stream]->setHeadMode(ACM_MPEG_STEREO); + break; + default: + delete record[card][stream]; + record[card][stream]=NULL; + return false; + } + record[card][stream]->setHeadFlags(ACM_MPEG_ID_MPEG1); + } + if(coding==4) { // PCM24 + record[card][stream]->setFormatTag(WAVE_FORMAT_PCM); + record[card][stream]->setBitsPerSample(24); + } + if(coding>4) { + delete record[card][stream]; + record[card][stream]=NULL; + return false; + } + record[card][stream]->setBextChunk(true); + record[card][stream]->setCartChunk(true); + record[card][stream]->setLevlChunk(true); + if(record[card][stream]->createWave()!=RDHPIRecordStream::Ok) { + delete record[card][stream]; + record[card][stream]=NULL; + return false; + } + chown((const char *)wavename,rd_config->uid(),rd_config->gid()); + if(!record[card][stream]->recordReady()) { + delete record[card][stream]; + record[card][stream]=NULL; + return false; + } + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiUnloadRecord(int card,int stream,unsigned *len) +{ +#ifdef HPI + if(record[card][stream]==NULL) { + return false; + } + if(record[card][stream]->getState()==RDHPIRecordStream::Recording) { + record[card][stream]->pause(); + } + record[card][stream]->disconnect(); + *len=record[card][stream]->samplesRecorded(); + record[card][stream]->closeWave(); + delete record[card][stream]; + record[card][stream]=NULL; + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiRecord(int card,int stream,int length,int thres) +{ +#ifdef HPI + if(record[card][stream]==NULL) { + return false; + } + if(thres!=0) { + if(record[card][stream]->haveInputVOX()) { + record[card][stream]->setInputVOX(thres); + } + else { + return false; + } + } + record[card][stream]->setRecordLength(length); + record[card][stream]->record(); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiStopRecord(int card,int stream) +{ +#ifdef HPI + if(record[card][stream]==NULL) { + return false; + } + record[card][stream]->pause(); + record[card][stream]->setInputVOX(-10000); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetClockSource(int card,int src) +{ +#ifdef HPI + return sound_card->setClockSource(card,(RDHPISoundCard::ClockSource)src); +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetInputVolume(int card,int stream,int level) +{ +#ifdef HPI + sound_card->setInputVolume(card,stream,level); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetOutputVolume(int card,int stream,int port,int level) +{ +#ifdef HPI + sound_card->setOutputVolume(card,stream,port,level); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiFadeOutputVolume(int card,int stream,int port,int level, + int length) +{ +#ifdef HPI + sound_card->fadeOutputVolume(card,stream,port,level,length); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetInputLevel(int card,int port,int level) +{ +#ifdef HPI + sound_card->setInputLevel(card,port,level); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetOutputLevel(int card,int port,int level) +{ +#ifdef HPI + sound_card->setOutputLevel(card,port,level); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetInputMode(int card,int stream,int mode) +{ +#ifdef HPI + switch(mode) { + case 0: + sound_card->setInputMode(card,stream,RDHPISoundCard::Normal); + break; + + case 1: + sound_card->setInputMode(card,stream,RDHPISoundCard::Swap); + break; + + case 2: + sound_card->setInputMode(card,stream,RDHPISoundCard::LeftOnly); + break; + + case 3: + sound_card->setInputMode(card,stream,RDHPISoundCard::RightOnly); + break; + + default: + return false; + } + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetOutputMode(int card,int stream,int mode) +{ +#ifdef HPI + switch(mode) { + case 0: + sound_card->setOutputMode(card,stream,RDHPISoundCard::Normal); + break; + + case 1: + sound_card->setOutputMode(card,stream,RDHPISoundCard::Swap); + break; + + case 2: + sound_card->setOutputMode(card,stream,RDHPISoundCard::LeftOnly); + break; + + case 3: + sound_card->setOutputMode(card,stream,RDHPISoundCard::RightOnly); + break; + + default: + return false; + } + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetInputVoxLevel(int card,int stream,int level) +{ +#ifdef HPI + sound_card->setInputStreamVOX(card,stream,level); + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiSetInputType(int card,int port,int type) +{ +#ifdef HPI + switch(type) { + case 0: + sound_card->setInputPortMux(card,port,RDHPISoundCard::LineIn); + break; + + case 1: + sound_card->setInputPortMux(card,port,RDHPISoundCard::AesEbuIn); + break; + + default: + return false; + } + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiGetInputStatus(int card,int port) +{ +#ifdef HPI + if(sound_card->getInputPortError(card,port)!=0) { + return false; + } + return true; +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiGetInputMeters(int card,int port,short levels[2]) +{ +#ifdef HPI + return sound_card->inputStreamMeter(card,port,levels); +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiGetOutputMeters(int card,int port,short levels[2]) +{ +#ifdef HPI + if(rd_config->useStreamMeters()) { + // + // This is UGLY, but needed to semi-support cards (like the ASI4215) + // that lack output port metering. + // + for(int i=0;igetOutputVolume(card,i,port)>-10000) { + return sound_card->outputStreamMeter(card,i,levels); + } + } + levels[0]=-10000; + levels[1]=-10000; + return true; + } + return sound_card->outputPortMeter(card,port,levels); +#else + return false; +#endif // HPI +} + + +bool MainObject::hpiGetStreamOutputMeters(int card,int stream,short levels[2]) +{ +#ifdef HPI + return sound_card->outputStreamMeter(card,stream,levels); +#else + return false; +#endif // HPI +} + + +void MainObject::hpiGetOutputPosition(int card,unsigned *pos) +{ +#ifdef HPI + for(int i=0;icurrentPosition()/ + play[card][i]->getSamplesPerSec(); + } + } +#endif // HPI + return; +} + + +bool MainObject::hpiSetPassthroughLevel(int card,int in_port,int out_port, + int level) +{ +#ifdef HPI + return sound_card->setPassthroughVolume(card,in_port,out_port,level); +#else + return false; +#endif // HPI +} diff --git a/cae/cae_jack.cpp b/cae/cae_jack.cpp index 80d8b909..9903dd74 100644 --- a/cae/cae_jack.cpp +++ b/cae/cae_jack.cpp @@ -17,7 +17,7 @@ // License along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -/* + #include #include @@ -961,6 +961,29 @@ bool MainObject::jackLoadRecord(int card,int stream,int coding,int chans, jack_ready[stream]=true; return true; + /* + if ((stream <0) || (stream >=RD_MAX_PORTS)){ + return false; + } + jack_record_wave[stream]=new RDWaveFile(wavename); + jack_record_wave[stream]->setFormatTag(WAVE_FORMAT_PCM); + jack_record_wave[stream]->setChannels(chans); + jack_record_wave[stream]->setSamplesPerSec(samprate); + jack_record_wave[stream]->setBitsPerSample(16); + jack_record_wave[stream]->setBextChunk(true); + jack_record_wave[stream]->setLevlChunk(true); + if(!jack_record_wave[stream]->createWave()) { + delete jack_record_wave[stream]; + jack_record_wave[stream]=NULL; + return false; + } + chown((const char *)wavename,rd_config->uid(),rd_config->gid()); + jack_input_channels[stream]=chans; + jack_record_ring[stream]=new RDRingBuffer(RINGBUFFER_SIZE); + jack_record_ring[stream]->reset(); + jack_ready[stream]=true; + return true; + */ #else return false; #endif // JACK @@ -1633,5 +1656,3 @@ void MainObject::JackSessionSetup() delete profile; #endif // JACK } - -*/ diff --git a/cae/driver.cpp b/cae/driver.cpp deleted file mode 100644 index ba70d99c..00000000 --- a/cae/driver.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// driver.cpp -// -// Abstract base class for CAE audio drivers. -// -// (C) Copyright 2002-2015 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 "driver.h" - -Driver::Driver(Driver::Type type,RDStation *station,RDConfig *config, - QObject *parent) - : QObject(parent) -{ - dvr_type=type; - dvr_station=station; - dvr_config=config; -} - - -Driver::~Driver() -{ -} - - -Driver::Type Driver::type() const -{ - return dvr_type; -} - - -bool Driver::connectPorts(const QString &out,const QString &in) -{ - return false; -} - - -bool Driver::disconnectPorts(const QString &out,const QString &in) -{ - return false; -} - - -RDStation *Driver::station() -{ - return dvr_station; -} - - -RDConfig *Driver::config() -{ - return dvr_config; -} - - -void Driver::logLine(RDConfig::LogPriority prio,const QString &line) -{ - FILE *file; - - dvr_config->log("caed",prio,line); - - if(dvr_config->caeLogfile().isEmpty()) { - return; - } - - QDateTime current=QDateTime::currentDateTime(); - - file=fopen(dvr_config->caeLogfile(),"a"); - if(file==NULL) { - return; - } - chmod(dvr_config->caeLogfile(),S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH); - fprintf(file,"%02d/%02d/%4d - %02d:%02d:%02d.%03d : %s\n", - current.date().month(), - current.date().day(), - current.date().year(), - current.time().hour(), - current.time().minute(), - current.time().second(), - current.time().msec(), - (const char *)line); - fclose(file); -} - - -QString Driver::typeText(Driver::Type type) -{ - QString ret=tr("Unknown"); - - switch(type) { - case Driver::Alsa: - ret=tr("Advanced Linux Sound Architecture"); - break; - - case Driver::Hpi: - ret=tr("AudioScience HPI"); - break; - - case Driver::Jack: - ret=tr("JACK Audio Connection Kit"); - break; - } - - return ret; -} diff --git a/cae/driver.h b/cae/driver.h deleted file mode 100644 index 980dba13..00000000 --- a/cae/driver.h +++ /dev/null @@ -1,94 +0,0 @@ -// driver.h -// -// Abstract base class for CAE audio drivers. -// -// (C) Copyright 2002-2015 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 DRIVER_H -#define DRIVER_H - -#include -#include - -#include -#include - -class Driver : public QObject -{ - Q_OBJECT - public: - enum Type {Hpi=0,Alsa=1,Jack=2}; - Driver(Driver::Type type,RDStation *station,RDConfig *config, - QObject *parent=0); - ~Driver(); - Driver::Type type() const; - virtual QString version()=0; - virtual QString cardName(int card)=0; - virtual int inputs(int card)=0; - virtual int outputs(int card)=0; - virtual int start(int next_card)=0; - virtual bool loadPlayback(int card,QString wavename,int *stream)=0; - virtual bool unloadPlayback(int card,int stream)=0; - virtual bool playbackPosition(int card,int stream,unsigned pos)=0; - virtual bool play(int card,int stream,int length,int speed,bool pitch, - bool rates)=0; - virtual bool stopPlayback(int card,int stream)=0; - virtual bool timescaleSupported(int card)=0; - virtual bool loadRecord(int card,int stream,int coding,int chans,int samprate, - int bitrate,QString wavename)=0; - virtual bool record(int card,int stream,int length,int thres)=0; - virtual bool stopRecord(int card,int stream)=0; - virtual bool unloadRecord(int card,int stream,unsigned *len)=0; - virtual bool setClockSource(int card,int src)=0; - virtual bool setInputVolume(int card,int stream,int level)=0; - virtual bool setOutputVolume(int card,int stream,int port,int level)=0; - virtual bool fadeOutputVolume(int card,int stream,int port,int level, - int length)=0; - virtual bool setInputLevel(int card,int port,int level)=0; - virtual bool setOutputLevel(int card,int port,int level)=0; - virtual bool setInputMode(int card,int stream,int mode)=0; - virtual bool setOutputMode(int card,int stream,int mode)=0; - virtual bool setInputVoxLevel(int card,int stream,int level)=0; - virtual bool setInputType(int card,int port,int type)=0; - virtual bool getInputStatus(int card,int port)=0; - virtual bool getInputMeters(int card,int port,short levels[2])=0; - virtual bool getOutputMeters(int card,int port,short levels[2])=0; - virtual bool getStreamOutputMeters(int card,int stream,short levels[2])=0; - virtual bool setPassthroughLevel(int card,int in_port,int out_port, - int level)=0; - virtual void getOutputPosition(int card,unsigned *pos)=0; - virtual bool connectPorts(const QString &out,const QString &in); - virtual bool disconnectPorts(const QString &out,const QString &in); - static QString typeText(Driver::Type type); - - signals: - void playStateChanged(int card,int stream,int state); - void recordStateChanged(int card,int stream,int state); - - protected: - RDStation *station(); - RDConfig *config(); - void logLine(RDConfig::LogPriority prio,const QString &line); - - private: - Driver::Type dvr_type; - RDStation *dvr_station; - RDConfig *dvr_config; -}; - - -#endif // DRIVER_H diff --git a/cae/driver_hpi.cpp b/cae/driver_hpi.cpp deleted file mode 100644 index 6f994e68..00000000 --- a/cae/driver_hpi.cpp +++ /dev/null @@ -1,566 +0,0 @@ -// driver_hpi.cpp -// -// CAE driver for AudioScience HPI devices -// -// (C) Copyright 2002-2015 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 "driver_hpi.h" - -HpiDriver::HpiDriver(RDStation *station,RDConfig *config,QObject *parent) - : Driver(Driver::Hpi,station,config,parent) -{ -#ifdef HPI - for(int i=0;isetFadeProfile(RD_FADE_TYPE); - for(int i=0;igetCardQuantity();i++) { - station->setCardDriver(i,RDStation::Hpi); - station->setCardName(i,hpi_sound_card->getCardDescription(i)); - station->setCardInputs(i,hpi_sound_card->getCardInputPorts(i)); - station->setCardOutputs(i,hpi_sound_card->getCardOutputPorts(i)); - } -#endif // HPI -} - - -HpiDriver::~HpiDriver() -{ -} - - -QString HpiDriver::version() -{ -#ifdef HPI - if(hpi_sound_card==NULL) { - return QString("not active"); - } - RDHPIInformation *info=hpi_sound_card->hpiInformation(0); - if(info->hpiVersion()==0) { - return QString("not active"); - } - return QString().sprintf("%d.%02d.%02d",info->hpiMajorVersion(), - info->hpiMinorVersion(),info->hpiPointVersion()); -#else - return QString("not enabled"); -#endif // HPI -} - - -QString HpiDriver::cardName(int card) -{ - return hpi_sound_card->getCardDescription(card); -} - - -int HpiDriver::inputs(int card) -{ - return hpi_sound_card->getCardInputPorts(card); -} - - -int HpiDriver::outputs(int card) -{ - return hpi_sound_card->getCardOutputPorts(card); -} - - -int HpiDriver::start(int next_card) -{ - return hpi_sound_card->getCardQuantity(); -} - - -bool HpiDriver::loadPlayback(int card,QString wavename,int *stream) -{ -#ifdef HPI - RDHPIPlayStream *playstream=new RDHPIPlayStream(hpi_sound_card); - playstream->setCard(card); - if(playstream->openWave(wavename)!=RDHPIPlayStream::Ok) { - logLine(RDConfig::LogNotice,QString().sprintf( - "Error: hpiLoadPlayback(%s) openWave() failed to open file", - (const char *) wavename) ); - delete playstream; - return false; - } - *stream=playstream->getStream(); - hpi_play[card][*stream]=playstream; - connect(hpi_play[card][*stream],SIGNAL(stateChanged(int,int,int)), - this,SLOT(playStateChangedData(int,int,int))); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::unloadPlayback(int card,int stream) -{ -#ifdef HPI - if(hpi_play[card][stream]==NULL) { - return false; - } - if(hpi_play[card][stream]->getState()==RDHPIPlayStream::Playing) { - hpi_play[card][stream]->pause(); - } - hpi_play[card][stream]->disconnect(); - hpi_play[card][stream]->closeWave(); - delete hpi_play[card][stream]; - hpi_play[card][stream]=NULL; - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::playbackPosition(int card,int stream,unsigned pos) -{ -#ifdef HPI - if(hpi_play[card][stream]==NULL) { - return false; - } - return hpi_play[card][stream]-> - setPosition((unsigned)((double)hpi_play[card][stream]->getSamplesPerSec()* - (double)pos/1000.0)); -#else - return false; -#endif // HPI -} - - -bool HpiDriver::play(int card,int stream,int length,int speed,bool pitch, - bool rates) -{ -#ifdef HPI - if(hpi_play[card][stream]==NULL) { - return false; - } - if(!hpi_play[card][stream]->setSpeed(speed,pitch,rates)) { - return false; - } - hpi_play[card][stream]->setPlayLength(length); - return hpi_play[card][stream]->play(); -#else - return false; -#endif // HPI -} - - -bool HpiDriver::stopPlayback(int card,int stream) -{ -#ifdef HPI - if(hpi_play[card][stream]==NULL) { - return false; - } - hpi_play[card][stream]->pause(); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::timescaleSupported(int card) -{ -#ifdef HPI - return hpi_sound_card->haveTimescaling(card); -#else - return false; -#endif // HPI -} - - -bool HpiDriver::loadRecord(int card,int stream,int coding,int chans, - int samprate,int bitrate,QString wavename) -{ -#ifdef HPI - hpi_record[card][stream]=new RDHPIRecordStream(hpi_sound_card); - connect(hpi_record[card][stream],SIGNAL(stateChanged(int,int,int)), - this,SLOT(recordStateChangedData(int,int,int))); - hpi_record[card][stream]->setCard(card); - hpi_record[card][stream]->setStream(stream); - hpi_record[card][stream]->nameWave(wavename); - hpi_record[card][stream]->setChannels(chans); - hpi_record[card][stream]->setSamplesPerSec(samprate); - if(coding==0) { // PCM16 - hpi_record[card][stream]->setFormatTag(WAVE_FORMAT_PCM); - hpi_record[card][stream]->setBitsPerSample(16); - } - if((coding==1)||(coding==2)) { // MPEG-1 - hpi_record[card][stream]->setFormatTag(WAVE_FORMAT_MPEG); - hpi_record[card][stream]->setHeadLayer(coding); - hpi_record[card][stream]->setHeadBitRate(bitrate); - hpi_record[card][stream]->setMextChunk(true); - switch(chans) { - case 1: - hpi_record[card][stream]->setHeadMode(ACM_MPEG_SINGLECHANNEL); - break; - case 2: - hpi_record[card][stream]->setHeadMode(ACM_MPEG_STEREO); - break; - default: - delete hpi_record[card][stream]; - hpi_record[card][stream]=NULL; - return false; - } - hpi_record[card][stream]->setHeadFlags(ACM_MPEG_ID_MPEG1); - } - if(coding==4) { // PCM24 - hpi_record[card][stream]->setFormatTag(WAVE_FORMAT_PCM); - hpi_record[card][stream]->setBitsPerSample(24); - } - if(coding>4) { - delete hpi_record[card][stream]; - hpi_record[card][stream]=NULL; - return false; - } - hpi_record[card][stream]->setBextChunk(true); - hpi_record[card][stream]->setCartChunk(true); - hpi_record[card][stream]->setLevlChunk(true); - if(hpi_record[card][stream]->createWave()!=RDHPIRecordStream::Ok) { - delete hpi_record[card][stream]; - hpi_record[card][stream]=NULL; - return false; - } - chown((const char *)wavename,config()->uid(),config()->gid()); - if(!hpi_record[card][stream]->recordReady()) { - delete hpi_record[card][stream]; - hpi_record[card][stream]=NULL; - return false; - } - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::record(int card,int stream,int length,int thres) -{ -#ifdef HPI - if(hpi_record[card][stream]==NULL) { - return false; - } - if(thres!=0) { - if(hpi_record[card][stream]->haveInputVOX()) { - hpi_record[card][stream]->setInputVOX(thres); - } - else { - return false; - } - } - hpi_record[card][stream]->setRecordLength(length); - hpi_record[card][stream]->record(); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::stopRecord(int card,int stream) -{ -#ifdef HPI - if(hpi_record[card][stream]==NULL) { - return false; - } - hpi_record[card][stream]->pause(); - hpi_record[card][stream]->setInputVOX(-10000); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::unloadRecord(int card,int stream,unsigned *len) -{ -#ifdef HPI - if(hpi_record[card][stream]==NULL) { - return false; - } - if(hpi_record[card][stream]->getState()==RDHPIRecordStream::Recording) { - hpi_record[card][stream]->pause(); - } - hpi_record[card][stream]->disconnect(); - *len=hpi_record[card][stream]->samplesRecorded(); - hpi_record[card][stream]->closeWave(); - delete hpi_record[card][stream]; - hpi_record[card][stream]=NULL; - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setClockSource(int card,int src) -{ -#ifdef HPI - return hpi_sound_card->setClockSource(card,(RDHPISoundCard::ClockSource)src); -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setInputVolume(int card,int stream,int level) -{ -#ifdef HPI - hpi_sound_card->setInputVolume(card,stream,level); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setOutputVolume(int card,int stream,int port,int level) -{ -#ifdef HPI - hpi_sound_card->setOutputVolume(card,stream,port,level); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::fadeOutputVolume(int card,int stream,int port,int level,int length) -{ -#ifdef HPI - hpi_sound_card->fadeOutputVolume(card,stream,port,level,length); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setInputLevel(int card,int port,int level) -{ -#ifdef HPI - hpi_sound_card->setInputLevel(card,port,level); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setOutputLevel(int card,int port,int level) -{ -#ifdef HPI - hpi_sound_card->setOutputLevel(card,port,level); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setInputMode(int card,int stream,int mode) -{ -#ifdef HPI - switch(mode) { - case 0: - hpi_sound_card->setInputMode(card,stream,RDHPISoundCard::Normal); - break; - - case 1: - hpi_sound_card->setInputMode(card,stream,RDHPISoundCard::Swap); - break; - - case 2: - hpi_sound_card->setInputMode(card,stream,RDHPISoundCard::LeftOnly); - break; - - case 3: - hpi_sound_card->setInputMode(card,stream,RDHPISoundCard::RightOnly); - break; - - default: - return false; - } - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setOutputMode(int card,int stream,int mode) -{ -#ifdef HPI - switch(mode) { - case 0: - hpi_sound_card->setOutputMode(card,stream,RDHPISoundCard::Normal); - break; - - case 1: - hpi_sound_card->setOutputMode(card,stream,RDHPISoundCard::Swap); - break; - - case 2: - hpi_sound_card->setOutputMode(card,stream,RDHPISoundCard::LeftOnly); - break; - - case 3: - hpi_sound_card->setOutputMode(card,stream,RDHPISoundCard::RightOnly); - break; - - default: - return false; - } - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setInputVoxLevel(int card,int stream,int level) -{ -#ifdef HPI - hpi_sound_card->setInputStreamVOX(card,stream,level); - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setInputType(int card,int port,int type) -{ -#ifdef HPI - switch(type) { - case 0: - hpi_sound_card->setInputPortMux(card,port,RDHPISoundCard::LineIn); - break; - - case 1: - hpi_sound_card->setInputPortMux(card,port,RDHPISoundCard::AesEbuIn); - break; - - default: - return false; - } - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::getInputStatus(int card,int port) -{ -#ifdef HPI - if(hpi_sound_card->getInputPortError(card,port)!=0) { - return false; - } - return true; -#else - return false; -#endif // HPI -} - - -bool HpiDriver::getInputMeters(int card,int port,short levels[2]) -{ -#ifdef HPI - return hpi_sound_card->inputStreamMeter(card,port,levels); -#else - return false; -#endif // HPI -} - - -bool HpiDriver::getOutputMeters(int card,int port,short levels[2]) -{ -#ifdef HPI - if(config()->useStreamMeters()) { - // - // This is UGLY, but needed to semi-support cards (like the ASI4215) - // that lack output port metering. - // - for(int i=0;igetOutputVolume(card,i,port)>-10000) { - return hpi_sound_card->outputStreamMeter(card,i,levels); - } - } - levels[0]=-10000; - levels[1]=-10000; - return true; - } - return hpi_sound_card->outputPortMeter(card,port,levels); -#else - return false; -#endif // HPI -} - - -bool HpiDriver::getStreamOutputMeters(int card,int stream,short levels[2]) -{ -#ifdef HPI - return hpi_sound_card->outputStreamMeter(card,stream,levels); -#else - return false; -#endif // HPI -} - - -bool HpiDriver::setPassthroughLevel(int card,int in_port,int out_port,int level) -{ -#ifdef HPI - return hpi_sound_card->setPassthroughVolume(card,in_port,out_port,level); -#else - return false; -#endif // HPI -} - - -void HpiDriver::getOutputPosition(int card,unsigned *pos) -{ -#ifdef HPI - for(int i=0;icurrentPosition()/ - hpi_play[card][i]->getSamplesPerSec(); - } - } -#endif // HPI -} - - -void HpiDriver::playStateChangedData(int card,int stream,int state) -{ - emit playStateChanged(card,stream,state); -} - - -void HpiDriver::recordStateChangedData(int card,int stream,int state) -{ - emit recordStateChanged(card,stream,state); -} diff --git a/cae/driver_hpi.h b/cae/driver_hpi.h deleted file mode 100644 index c316fe7f..00000000 --- a/cae/driver_hpi.h +++ /dev/null @@ -1,86 +0,0 @@ -// driver_hpi.h -// -// CAE driver for AudioScience HPI devices -// -// (C) Copyright 2002-2015 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 DRIVER_HPI_H -#define DRIVER_HPI_H - -#include - -#ifdef HPI -#include -#include -#include -#endif // HPI - -#include "driver.h" - -class HpiDriver : public Driver -{ - Q_OBJECT - public: - HpiDriver(RDStation *station,RDConfig *config,QObject *parent=0); - ~HpiDriver(); - QString version(); - QString cardName(int card); - int inputs(int card); - int outputs(int card); - int start(int next_card); - bool loadPlayback(int card,QString wavename,int *stream); - bool unloadPlayback(int card,int stream); - bool playbackPosition(int card,int stream,unsigned pos); - bool play(int card,int stream,int length,int speed,bool pitch,bool rates); - bool stopPlayback(int card,int stream); - bool timescaleSupported(int card); - bool loadRecord(int card,int stream,int coding,int chans,int samprate, - int bitrate,QString wavename); - bool record(int card,int stream,int length,int thres); - bool stopRecord(int card,int stream); - bool unloadRecord(int card,int stream,unsigned *len); - bool setClockSource(int card,int src); - bool setInputVolume(int card,int stream,int level); - bool setOutputVolume(int card,int stream,int port,int level); - bool fadeOutputVolume(int card,int stream,int port,int level,int length); - bool setInputLevel(int card,int port,int level); - bool setOutputLevel(int card,int port,int level); - bool setInputMode(int card,int stream,int mode); - bool setOutputMode(int card,int stream,int mode); - bool setInputVoxLevel(int card,int stream,int level); - bool setInputType(int card,int port,int type); - bool getInputStatus(int card,int port); - bool getInputMeters(int card,int port,short levels[2]); - bool getOutputMeters(int card,int port,short levels[2]); - bool getStreamOutputMeters(int card,int stream,short levels[2]); - bool setPassthroughLevel(int card,int in_port,int out_port,int level); - void getOutputPosition(int card,unsigned *pos); - - private slots: - void playStateChangedData(int card,int stream,int state); - void recordStateChangedData(int card,int stream,int state); - - private: -#ifdef HPI - RDHPISoundCard *hpi_sound_card; - RDHPIRecordStream *hpi_record[RD_MAX_CARDS][RD_MAX_STREAMS]; - RDHPIPlayStream *hpi_play[RD_MAX_CARDS][RD_MAX_STREAMS]; -#endif // HPI -}; - - -#endif // DRIVER_HPI_H diff --git a/cae/driverfactory.cpp b/cae/driverfactory.cpp deleted file mode 100644 index d4c71213..00000000 --- a/cae/driverfactory.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// driverfactory.cpp -// -// Instantiate CAE audio drivers -// -// (C) Copyright 2015 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 "driver_hpi.h" - -#include "driverfactory.h" - -Driver *DriverFactory(Driver::Type type,RDStation *station,RDConfig *config, - QObject *parent) -{ - Driver *dvr=NULL; - - switch(type) { - case Driver::Alsa: - break; - - case Driver::Hpi: -#ifdef HPI - dvr=new HpiDriver(station,config,parent); -#endif // HPI - break; - - case Driver::Jack: - break; - } - - return dvr; -} diff --git a/cae/driverfactory.h b/cae/driverfactory.h deleted file mode 100644 index d7471658..00000000 --- a/cae/driverfactory.h +++ /dev/null @@ -1,30 +0,0 @@ -// driverfactory.h -// -// Instantiate CAE audio drivers -// -// (C) Copyright 2015 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 DRIVERFACTORY_H -#define DRIVERFACTORY_H - -#include "driver.h" - -Driver *DriverFactory(Driver::Type type,RDStation *station,RDConfig *config, - QObject *parent=0); - - -#endif // DRIVERFACTORY_H