#include <AudioHdr.h>
AudioEndian AudioHdr::localByteOrder() const
{
short sTestHost;
short sTestNetwork;
static AudioEndian ae = UNDEFINED_ENDIAN;
if (ae == UNDEFINED_ENDIAN) {
sTestHost = MAXSHORT;
sTestNetwork = htons(sTestHost);
if (sTestNetwork != sTestHost) {
ae = LITTLE_ENDIAN;
} else {
ae = BIG_ENDIAN;
}
}
return (ae);
}
void AudioHdr::
Clear()
{
sample_rate = 0;
samples_per_unit = 0;
bytes_per_unit = 0;
channels = 0;
encoding = NONE;
}
AudioError AudioHdr::
Validate() const
{
if ((bytes_per_unit < 1) || (samples_per_unit < 1) ||
(sample_rate < 1) || (channels < 1))
return (AUDIO_ERR_BADHDR);
switch (encoding) {
case NONE:
return (AUDIO_ERR_BADHDR);
case LINEAR:
if (bytes_per_unit > 4)
return (AUDIO_ERR_PRECISION);
if (samples_per_unit != 1)
return (AUDIO_ERR_HDRINVAL);
break;
case FLOAT:
if ((bytes_per_unit != 4) && (bytes_per_unit != 8))
return (AUDIO_ERR_PRECISION);
if (samples_per_unit != 1)
return (AUDIO_ERR_HDRINVAL);
break;
case ULAW:
case ALAW:
case G722:
if (bytes_per_unit != 1)
return (AUDIO_ERR_PRECISION);
if (samples_per_unit != 1)
return (AUDIO_ERR_HDRINVAL);
break;
case G721:
case DVI:
if ((bytes_per_unit != 1) || (samples_per_unit != 2))
return (AUDIO_ERR_PRECISION);
break;
case G723:
if ((bytes_per_unit != 3) || (samples_per_unit != 8))
return (AUDIO_ERR_PRECISION);
break;
}
return (AUDIO_SUCCESS);
}
Double AudioHdr::
Bytes_to_Time(
off_t cnt) const
{
if ((cnt == AUDIO_UNKNOWN_SIZE) || (Validate() != AUDIO_SUCCESS))
return (AUDIO_UNKNOWN_TIME);
cnt -= (cnt % (bytes_per_unit * channels));
return (Double) ((double)cnt /
((double)(channels * bytes_per_unit * sample_rate) /
(double)samples_per_unit));
}
off_t AudioHdr::
Time_to_Bytes(
Double sec) const
{
off_t offset;
if (Undefined(sec) || (Validate() != AUDIO_SUCCESS))
return (AUDIO_UNKNOWN_SIZE);
offset = (off_t)(0.5 + (sec *
((double)(channels * bytes_per_unit * sample_rate) /
(double)samples_per_unit)));
offset -= (offset % (bytes_per_unit * channels));
return (offset);
}
off_t AudioHdr::
Bytes_to_Bytes(
off_t& cnt) const
{
if (Validate() != AUDIO_SUCCESS)
return (AUDIO_UNKNOWN_SIZE);
cnt -= (cnt % (bytes_per_unit * channels));
return (cnt);
}
size_t AudioHdr::
Bytes_to_Bytes(
size_t& cnt) const
{
if (Validate() != AUDIO_SUCCESS)
return (AUDIO_UNKNOWN_SIZE);
cnt -= (cnt % (bytes_per_unit * channels));
return (cnt);
}
Double AudioHdr::
Samples_to_Time(
unsigned long cnt) const
{
if ((cnt == AUDIO_UNKNOWN_SIZE) || (Validate() != AUDIO_SUCCESS))
return (AUDIO_UNKNOWN_TIME);
return ((Double)(((double)cnt * (double)samples_per_unit) /
(double)sample_rate));
}
unsigned long AudioHdr::
Time_to_Samples(
Double sec) const
{
if (Undefined(sec) || (Validate() != AUDIO_SUCCESS))
return (AUDIO_UNKNOWN_SIZE);
return ((unsigned long) (AUDIO_MINFLOAT +
(((double)sec * (double)sample_rate) / (double)samples_per_unit)));
}
unsigned int AudioHdr::
FrameLength() const
{
return (bytes_per_unit * channels);
}