mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-10-14 22:51:13 +02:00
2019-06-17 Fred Gleason <fredg@paravelsystems.com>
* Refactored logging system to use syslog(3) exclusively. * Removed the 'Facility=', 'LogDirectory=', 'CoreDumpDirectory=' and 'LogPattern=' directives from rd.conf(5).
This commit is contained in:
165
cae/cae_alsa.cpp
165
cae/cae_alsa.cpp
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <math.h>
|
||||
#include <signal.h>
|
||||
#include <syslog.h>
|
||||
|
||||
#include <samplerate.h>
|
||||
|
||||
@@ -72,9 +73,8 @@ void *AlsaCaptureCallback(void *ptr)
|
||||
(!alsa_format->exiting))||(s<0)) {
|
||||
snd_pcm_drop (alsa_format->pcm);
|
||||
snd_pcm_prepare(alsa_format->pcm);
|
||||
rd_config->log("caed",RDConfig::LogNotice,QString().
|
||||
sprintf("****** ALSA Capture Xrun - Card: %d ******",
|
||||
alsa_format->card));
|
||||
syslog(LOG_DEBUG,"****** ALSA Capture Xrun - Card: %d ******",
|
||||
alsa_format->card);
|
||||
}
|
||||
else {
|
||||
switch(alsa_format->format) {
|
||||
@@ -510,21 +510,18 @@ void *AlsaPlayCallback(void *ptr)
|
||||
int s=snd_pcm_writei(alsa_format->pcm,alsa_format->card_buffer,n);
|
||||
if(s!=n) {
|
||||
if(s<0) {
|
||||
rd_config->log("caed",RDConfig::LogNotice,
|
||||
QString().sprintf("*** alsa error %d: %s",-s,snd_strerror(s)));
|
||||
syslog(LOG_WARNING,"*** alsa error %d: %s",-s,snd_strerror(s));
|
||||
}
|
||||
else {
|
||||
rd_config->log("caed",RDConfig::LogNotice,
|
||||
QString().sprintf("period size mismatch - wrote %d\n",s));
|
||||
syslog(LOG_WARNING,"period size mismatch - wrote %d",s);
|
||||
}
|
||||
}
|
||||
if((snd_pcm_state(alsa_format->pcm)!=SND_PCM_STATE_RUNNING)&&
|
||||
(!alsa_format->exiting)) {
|
||||
snd_pcm_drop (alsa_format->pcm);
|
||||
snd_pcm_prepare(alsa_format->pcm);
|
||||
rd_config->log("caed",RDConfig::LogNotice,QString().
|
||||
sprintf("****** ALSA Playout Xrun - Card: %d ******",
|
||||
alsa_format->card));
|
||||
syslog(LOG_DEBUG,"****** ALSA Playout Xrun - Card: %d ******",
|
||||
alsa_format->card);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -570,7 +567,6 @@ void MainObject::AlsaInitCallback()
|
||||
|
||||
void MainObject::alsaStopTimerData(int cardstream)
|
||||
{
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf("alsaStopTimerData(%d)",cardstream));
|
||||
#ifdef ALSA
|
||||
int card=cardstream/RD_MAX_STREAMS;
|
||||
int stream=cardstream-card*RD_MAX_STREAMS;
|
||||
@@ -603,7 +599,7 @@ void MainObject::alsaFadeTimerData(int cardstream)
|
||||
alsa_fade_timer[card][stream]->stop();
|
||||
}
|
||||
}
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().sprintf("FadeLevel: %d",level));
|
||||
syslog(LOG_DEBUG,"FadeLevel: %d",level);
|
||||
alsaSetOutputVolume(card,stream,alsa_fade_port[card][stream],level);
|
||||
#endif // ALSA
|
||||
}
|
||||
@@ -723,9 +719,8 @@ void MainObject::alsaInit(RDStation *station)
|
||||
if(cae_driver[i]==RDStation::Alsa) {
|
||||
station->setCardDriver(i,RDStation::Alsa);
|
||||
if(snd_ctl_open(&snd_ctl,dev,0)<0) {
|
||||
rd_config->log("caed",RDConfig::LogNotice,QString().
|
||||
sprintf("no control device found for %s",
|
||||
(const char *)dev));
|
||||
syslog(LOG_DEBUG,"no control device found for %s",
|
||||
(const char *)dev);
|
||||
station->
|
||||
setCardName(i,
|
||||
QString().sprintf("ALSA Device %s",(const char *)dev));
|
||||
@@ -783,17 +778,14 @@ bool MainObject::alsaLoadPlayback(int card,QString wavename,int *stream)
|
||||
{
|
||||
#ifdef ALSA
|
||||
if(alsa_play_format[card].exiting||((*stream=GetAlsaOutputStream(card))<0)) {
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf(
|
||||
"Error: alsaLoadPlayback(%s) GetAlsaOutputStream():%d < 0",
|
||||
(const char *) wavename,
|
||||
*stream) );
|
||||
syslog(LOG_WARNING,"alsaLoadPlayback(%s) GetAlsaOutputStream():%d < 0",
|
||||
(const char *)wavename.toUtf8(),*stream);
|
||||
return false;
|
||||
}
|
||||
alsa_play_wave[card][*stream]=new RDWaveFile(wavename);
|
||||
if(!alsa_play_wave[card][*stream]->openWave()) {
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf(
|
||||
"Error: alsaLoadPlayback(%s) openWave() failed to open file",
|
||||
(const char *) wavename) );
|
||||
syslog(LOG_WARNING,"alsaLoadPlayback(%s) openWave() failed to open file",
|
||||
(const char *)wavename.toUtf8());
|
||||
delete alsa_play_wave[card][*stream];
|
||||
alsa_play_wave[card][*stream]=NULL;
|
||||
FreeAlsaOutputStream(card,*stream);
|
||||
@@ -810,11 +802,11 @@ bool MainObject::alsaLoadPlayback(int card,QString wavename,int *stream)
|
||||
break;
|
||||
|
||||
default:
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf(
|
||||
"Error: alsaLoadPlayback(%s) getFormatTag()%d || getBistsPerSample()%d failed",
|
||||
(const char *) wavename,
|
||||
syslog(LOG_WARNING,
|
||||
"alsaLoadPlayback(%s) getFormatTag()%d || getBistsPerSample()%d failed",
|
||||
(const char *)wavename.toUtf8(),
|
||||
alsa_play_wave[card][*stream]->getFormatTag(),
|
||||
alsa_play_wave[card][*stream]->getBitsPerSample() ));
|
||||
alsa_play_wave[card][*stream]->getBitsPerSample());
|
||||
delete alsa_play_wave[card][*stream];
|
||||
alsa_play_wave[card][*stream]=NULL;
|
||||
FreeAlsaOutputStream(card,*stream);
|
||||
@@ -998,9 +990,9 @@ bool MainObject::alsaLoadRecord(int card,int stream,int coding,int chans,
|
||||
break;
|
||||
|
||||
default:
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().
|
||||
sprintf("requested unsupported channel count %d, card: %d, stream: %d",
|
||||
chans,card,stream));
|
||||
syslog(LOG_WARNING,
|
||||
"requested unsupported channel count %d, card: %d, stream: %d",
|
||||
chans,card,stream);
|
||||
delete alsa_record_wave[card][stream];
|
||||
alsa_record_wave[card][stream]=NULL;
|
||||
return false;
|
||||
@@ -1026,9 +1018,9 @@ bool MainObject::alsaLoadRecord(int card,int stream,int coding,int chans,
|
||||
break;
|
||||
|
||||
default:
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().
|
||||
sprintf("requested invalid audio encoding %d, card: %d, stream: %d",
|
||||
coding,card,stream));
|
||||
syslog(LOG_WARNING,
|
||||
"requested invalid audio encoding %d, card: %d, stream: %d",
|
||||
coding,card,stream);
|
||||
delete alsa_record_wave[card][stream];
|
||||
alsa_record_wave[card][stream]=NULL;
|
||||
return false;
|
||||
@@ -1366,17 +1358,16 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
snd_pcm_hw_params_alloca(&hwparams);
|
||||
snd_pcm_hw_params_any(pcm,hwparams);
|
||||
|
||||
rd_config->log("caed",RDConfig::LogInfo,QString().
|
||||
sprintf("Starting ALSA Capture Device %s:",
|
||||
(const char *)dev));
|
||||
syslog(LOG_INFO,"Starting ALSA Capture Device %s:",
|
||||
(const char *)dev.toUtf8());
|
||||
|
||||
//
|
||||
// Access Type
|
||||
//
|
||||
if(snd_pcm_hw_params_test_access(pcm,hwparams,
|
||||
SND_PCM_ACCESS_RW_INTERLEAVED)<0) {
|
||||
rd_config->log("caed",RDConfig::LogErr," Interleaved access not supported,");
|
||||
rd_config->log("caed",RDConfig::LogErr," aborting initialization of device.");
|
||||
syslog(LOG_WARNING," Interleaved access not supported,");
|
||||
syslog(LOG_WARNING," aborting initialization of device.");
|
||||
return false;
|
||||
}
|
||||
snd_pcm_hw_params_set_access(pcm,hwparams,SND_PCM_ACCESS_RW_INTERLEAVED);
|
||||
@@ -1386,18 +1377,18 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
//
|
||||
if(snd_pcm_hw_params_test_format(pcm,hwparams,SND_PCM_FORMAT_S32_LE)==0) {
|
||||
alsa_capture_format[card].format=SND_PCM_FORMAT_S32_LE;
|
||||
rd_config->log("caed",RDConfig::LogDebug," Format = 32 bit little-endian");
|
||||
syslog(LOG_INFO," Format = 32 bit little-endian");
|
||||
}
|
||||
else {
|
||||
if(snd_pcm_hw_params_test_format(pcm,hwparams,SND_PCM_FORMAT_S16_LE)==0) {
|
||||
alsa_capture_format[card].format=SND_PCM_FORMAT_S16_LE;
|
||||
rd_config->log("caed",RDConfig::LogDebug," Format = 16 bit little-endian");
|
||||
syslog(LOG_INFO," Format = 16 bit little-endian");
|
||||
}
|
||||
else {
|
||||
rd_config->log("caed",RDConfig::LogErr,
|
||||
" Neither 16 nor 32 bit little-endian formats available,");
|
||||
rd_config->log("caed",RDConfig::LogErr,
|
||||
" aborting initialization of device.");
|
||||
syslog(LOG_WARNING,
|
||||
" Neither 16 nor 32 bit little-endian formats available,");
|
||||
syslog(LOG_WARNING,
|
||||
" aborting initialization of device.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1415,14 +1406,13 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
snd_pcm_hw_params_set_rate_near(pcm,hwparams,&sr,&dir);
|
||||
if((sr<(system_sample_rate-RD_ALSA_SAMPLE_RATE_TOLERANCE))||
|
||||
(sr>(system_sample_rate+RD_ALSA_SAMPLE_RATE_TOLERANCE))) {
|
||||
rd_config->log("caed",RDConfig::LogErr,
|
||||
QString().sprintf(" Asked for sample rate %u, got %u",
|
||||
system_sample_rate,sr));
|
||||
rd_config->log("caed",RDConfig::LogErr," Sample rate unsupported by device");
|
||||
syslog(LOG_WARNING," Asked for sample rate %u, got %u",
|
||||
system_sample_rate,sr);
|
||||
syslog(LOG_WARNING," Sample rate unsupported by device");
|
||||
return false;
|
||||
}
|
||||
alsa_capture_format[card].sample_rate=sr;
|
||||
rd_config->log("caed",RDConfig::LogNotice,QString().sprintf(" SampleRate = %u",sr));
|
||||
syslog(LOG_INFO," SampleRate = %u",sr);
|
||||
|
||||
//
|
||||
// Channels
|
||||
@@ -1436,9 +1426,8 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
snd_pcm_hw_params_set_channels_near(pcm,hwparams,
|
||||
&alsa_capture_format[card].channels);
|
||||
alsa_play_format[card].capture_channels=alsa_capture_format[card].channels;
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().
|
||||
sprintf(" Aggregate Channels = %u",
|
||||
alsa_capture_format[card].channels));
|
||||
syslog(LOG_INFO," Aggregate Channels = %u",
|
||||
alsa_capture_format[card].channels);
|
||||
|
||||
//
|
||||
// Buffer Size
|
||||
@@ -1446,25 +1435,23 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
alsa_capture_format[card].periods=rd_config->alsaPeriodQuantity();
|
||||
snd_pcm_hw_params_set_periods_near(pcm,hwparams,
|
||||
&alsa_capture_format[card].periods,&dir);
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().sprintf(" Periods = %u",
|
||||
alsa_capture_format[card].periods));
|
||||
syslog(LOG_INFO," Periods = %u",alsa_capture_format[card].periods);
|
||||
alsa_capture_format[card].buffer_size=
|
||||
alsa_capture_format[card].periods*rd_config->alsaPeriodSize();
|
||||
snd_pcm_hw_params_set_buffer_size_near(pcm,hwparams,
|
||||
&alsa_capture_format[card].buffer_size);
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().sprintf(" BufferSize = %u frames",
|
||||
(unsigned)alsa_capture_format[card].buffer_size));
|
||||
syslog(LOG_INFO," BufferSize = %u frames",
|
||||
(unsigned)alsa_capture_format[card].buffer_size);
|
||||
|
||||
//
|
||||
// Fire It Up
|
||||
//
|
||||
if((err=snd_pcm_hw_params(pcm,hwparams))<0) {
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf(" Device Error: %s,",
|
||||
(const char *)snd_strerror(err)));
|
||||
rd_config->log("caed",RDConfig::LogErr," aborting initialization of device.");
|
||||
syslog(LOG_WARNING," Device Error: %s,",snd_strerror(err));
|
||||
syslog(LOG_WARNING," aborting initialization of device.");
|
||||
return false;
|
||||
}
|
||||
rd_config->log("caed",RDConfig::LogNotice," Device started successfully");
|
||||
syslog(LOG_INFO," Device started successfully");
|
||||
switch(alsa_capture_format[card].format) {
|
||||
case SND_PCM_FORMAT_S16_LE:
|
||||
alsa_capture_format[card].card_buffer_size=
|
||||
@@ -1494,9 +1481,8 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
snd_pcm_sw_params_current(pcm,swparams);
|
||||
snd_pcm_sw_params_set_avail_min(pcm,swparams,rd_config->alsaPeriodSize());
|
||||
if((err=snd_pcm_sw_params(pcm,swparams))<0) {
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf("ALSA Device %s: %s",
|
||||
(const char *)dev,
|
||||
(const char *)snd_strerror(err)));
|
||||
syslog(LOG_WARNING,"ALSA Device %s: %s",(const char *)dev.toUtf8(),
|
||||
snd_strerror(err));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1530,16 +1516,16 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
snd_pcm_hw_params_alloca(&hwparams);
|
||||
snd_pcm_hw_params_any(pcm,hwparams);
|
||||
|
||||
rd_config->log("caed",RDConfig::LogNotice,QString().sprintf("Starting ALSA Play Device %s:",
|
||||
(const char *)dev));
|
||||
syslog(LOG_INFO,"Starting ALSA Play Device %s:",
|
||||
(const char *)dev.toUtf8());
|
||||
|
||||
//
|
||||
// Access Type
|
||||
//
|
||||
if(snd_pcm_hw_params_test_access(pcm,hwparams,
|
||||
SND_PCM_ACCESS_RW_INTERLEAVED)<0) {
|
||||
rd_config->log("caed",RDConfig::LogErr," Interleaved access not supported,");
|
||||
rd_config->log("caed",RDConfig::LogErr," aborting initialization of device.");
|
||||
syslog(LOG_WARNING," Interleaved access not supported,");
|
||||
syslog(LOG_WARNING," aborting initialization of device.");
|
||||
return false;
|
||||
}
|
||||
snd_pcm_hw_params_set_access(pcm,hwparams,SND_PCM_ACCESS_RW_INTERLEAVED);
|
||||
@@ -1549,17 +1535,17 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
//
|
||||
if(snd_pcm_hw_params_test_format(pcm,hwparams,SND_PCM_FORMAT_S32_LE)==0) {
|
||||
alsa_play_format[card].format=SND_PCM_FORMAT_S32_LE;
|
||||
rd_config->log("caed",RDConfig::LogDebug," Format = 32 bit little-endian");
|
||||
syslog(LOG_INFO," Format = 32 bit little-endian");
|
||||
}
|
||||
else {
|
||||
if(snd_pcm_hw_params_test_format(pcm,hwparams,SND_PCM_FORMAT_S16_LE)==0) {
|
||||
alsa_play_format[card].format=SND_PCM_FORMAT_S16_LE;
|
||||
rd_config->log("caed",RDConfig::LogDebug," Format = 16 bit little-endian");
|
||||
syslog(LOG_INFO," Format = 16 bit little-endian");
|
||||
}
|
||||
else {
|
||||
rd_config->log("caed",RDConfig::LogErr,
|
||||
" Neither 16 nor 32 bit little-endian formats available,");
|
||||
rd_config->log("caed",RDConfig::LogErr," aborting initialization of device.");
|
||||
syslog(LOG_WARNING,
|
||||
" Neither 16 nor 32 bit little-endian formats available,");
|
||||
syslog(LOG_WARNING," aborting initialization of device.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1572,14 +1558,13 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
snd_pcm_hw_params_set_rate_near(pcm,hwparams,&sr,&dir);
|
||||
if((sr<(system_sample_rate-RD_ALSA_SAMPLE_RATE_TOLERANCE))||
|
||||
(sr>(system_sample_rate+RD_ALSA_SAMPLE_RATE_TOLERANCE))) {
|
||||
rd_config->log("caed",RDConfig::LogErr,
|
||||
QString().sprintf(" Asked for sample rate %u, got %u",
|
||||
system_sample_rate,sr));
|
||||
rd_config->log("caed",RDConfig::LogErr," Sample rate unsupported by device");
|
||||
syslog(LOG_WARNING," Asked for sample rate %u, got %u",
|
||||
system_sample_rate,sr);
|
||||
syslog(LOG_WARNING," Sample rate unsupported by device");
|
||||
return false;
|
||||
}
|
||||
alsa_play_format[card].sample_rate=sr;
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().sprintf(" SampleRate = %u",sr));
|
||||
syslog(LOG_INFO," SampleRate = %u",sr);
|
||||
|
||||
//
|
||||
// Channels
|
||||
@@ -1592,35 +1577,30 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
}
|
||||
snd_pcm_hw_params_set_channels_near(pcm,hwparams,
|
||||
&alsa_play_format[card].channels);
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().sprintf(" Aggregate Channels = %u",
|
||||
alsa_play_format[card].channels));
|
||||
|
||||
syslog(LOG_INFO," Aggregate Channels = %u",alsa_play_format[card].channels);
|
||||
//
|
||||
// Buffer Size
|
||||
//
|
||||
alsa_play_format[card].periods=rd_config->alsaPeriodQuantity();
|
||||
snd_pcm_hw_params_set_periods_near(pcm,hwparams,
|
||||
&alsa_play_format[card].periods,&dir);
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().sprintf(" Periods = %u",
|
||||
alsa_play_format[card].periods));
|
||||
syslog(LOG_INFO," Periods = %u",alsa_play_format[card].periods);
|
||||
alsa_play_format[card].buffer_size=
|
||||
alsa_play_format[card].periods*rd_config->alsaPeriodSize();
|
||||
snd_pcm_hw_params_set_buffer_size_near(pcm,hwparams,
|
||||
&alsa_play_format[card].buffer_size);
|
||||
rd_config->log("caed",RDConfig::LogDebug,QString().
|
||||
sprintf(" BufferSize = %u frames",
|
||||
(unsigned)alsa_play_format[card].buffer_size));
|
||||
syslog(LOG_INFO," BufferSize = %u frames",
|
||||
(unsigned)alsa_play_format[card].buffer_size);
|
||||
|
||||
//
|
||||
// Fire It Up
|
||||
//
|
||||
if((err=snd_pcm_hw_params(pcm,hwparams))<0) {
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf(" Device Error: %s,",
|
||||
(const char *)snd_strerror(err)));
|
||||
rd_config->log("caed",RDConfig::LogErr," aborting initialization of device.");
|
||||
syslog(LOG_WARNING," Device Error: %s,",snd_strerror(err));
|
||||
syslog(LOG_ERR," aborting initialization of device.");
|
||||
return false;
|
||||
}
|
||||
rd_config->log("caed",RDConfig::LogNotice," Device started successfully");
|
||||
syslog(LOG_INFO," Device started successfully");
|
||||
switch(alsa_play_format[card].format) {
|
||||
case SND_PCM_FORMAT_S16_LE:
|
||||
alsa_play_format[card].card_buffer_size=
|
||||
@@ -1649,9 +1629,8 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm)
|
||||
snd_pcm_sw_params_current(pcm,swparams);
|
||||
snd_pcm_sw_params_set_avail_min(pcm,swparams,rd_config->alsaPeriodSize());
|
||||
if((err=snd_pcm_sw_params(pcm,swparams))<0) {
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().sprintf("ALSA Device %s: %s",
|
||||
(const char *)dev,
|
||||
(const char *)snd_strerror(err)));
|
||||
syslog(LOG_WARNING,"ALSA Device %s: %s",
|
||||
(const char *)dev.toUtf8(),snd_strerror(err));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1741,8 +1720,8 @@ void MainObject::WriteAlsaBuffer(int card,int stream,int16_t *buffer,unsigned le
|
||||
alsa_record_wave[card][stream]->writeWave(mpeg,s);
|
||||
}
|
||||
else {
|
||||
rd_config->log("caed",RDConfig::LogErr,QString().
|
||||
sprintf("TwoLAME encode error, card: %d, stream: %d",card,stream));
|
||||
syslog(LOG_WARNING,"TwoLAME encode error, card: %d, stream: %d",
|
||||
card,stream);
|
||||
}
|
||||
}
|
||||
#endif // HAVE_TWOLAME
|
||||
|
Reference in New Issue
Block a user