/** * enum cip_flags - describes details of the streaming protocol * @CIP_NONBLOCKING: In non-blocking mode, each packet contains * sample_rate/8000 samples, with rounding up or down to adjust * for clock skew and left-over fractional samples. This should * be used if supported by the device. * @CIP_BLOCKING: In blocking mode, each packet contains either zero or * SYT_INTERVAL samples, with these two types alternating so that * the overall sample rate comes out right. * @CIP_EMPTY_WITH_TAG0: Only for in-stream. Empty in-packets have TAG0. * @CIP_DBC_IS_END_EVENT: The value of dbc in an packet corresponds to the end * of event in the packet. Out of IEC 61883. * @CIP_WRONG_DBS: Only for in-stream. The value of dbs is wrong in in-packets. * The value of data_block_quadlets is used instead of reported value. * @CIP_SKIP_DBC_ZERO_CHECK: Only for in-stream. Packets with zero in dbc is * skipped for detecting discontinuity. * @CIP_EMPTY_HAS_WRONG_DBC: Only for in-stream. The value of dbc in empty * packet is wrong but the others are correct. * @CIP_JUMBO_PAYLOAD: Only for in-stream. The number of data blocks in an * packet is larger than IEC 61883-6 defines. Current implementation * allows 5 times as large as IEC 61883-6 defines. * @CIP_HEADER_WITHOUT_EOH: Only for in-stream. CIP Header doesn't include * valid EOH. * @CIP_NO_HEADER: a lack of headers in packets * @CIP_UNALIGHED_DBC: Only for in-stream. The value of dbc is not alighed to * the value of current SYT_INTERVAL; e.g. initial value is not zero. * @CIP_UNAWARE_SYT: For outgoing packet, the value in SYT field of CIP is 0xffff. * For incoming packet, the value in SYT field of CIP is not handled. * @CIP_DBC_IS_PAYLOAD_QUADLETS: Available for incoming packet, and only effective with * CIP_DBC_IS_END_EVENT flag. The value of dbc field is the number of accumulated quadlets * in CIP payload, instead of the number of accumulated data blocks.
*/ enum cip_flags {
CIP_NONBLOCKING = 0x00,
CIP_BLOCKING = 0x01,
CIP_EMPTY_WITH_TAG0 = 0x02,
CIP_DBC_IS_END_EVENT = 0x04,
CIP_WRONG_DBS = 0x08,
CIP_SKIP_DBC_ZERO_CHECK = 0x10,
CIP_EMPTY_HAS_WRONG_DBC = 0x20,
CIP_JUMBO_PAYLOAD = 0x40,
CIP_HEADER_WITHOUT_EOH = 0x80,
CIP_NO_HEADER = 0x100,
CIP_UNALIGHED_DBC = 0x200,
CIP_UNAWARE_SYT = 0x400,
CIP_DBC_IS_PAYLOAD_QUADLETS = 0x800,
};
/** * enum cip_sfc - supported Sampling Frequency Codes (SFCs) * @CIP_SFC_32000: 32,000 data blocks * @CIP_SFC_44100: 44,100 data blocks * @CIP_SFC_48000: 48,000 data blocks * @CIP_SFC_88200: 88,200 data blocks * @CIP_SFC_96000: 96,000 data blocks * @CIP_SFC_176400: 176,400 data blocks * @CIP_SFC_192000: 192,000 data blocks * @CIP_SFC_COUNT: the number of supported SFCs * * These values are used to show nominal Sampling Frequency Code in * Format Dependent Field (FDF) of AMDTP packet header. In IEC 61883-6:2002, * this code means the number of events per second. Actually the code * represents the number of data blocks transferred per second in an AMDTP * stream. * * In IEC 61883-6:2005, some extensions were added to support more types of * data such as 'One Bit LInear Audio', therefore the meaning of SFC became * different depending on the types. * * Currently our implementation is compatible with IEC 61883-6:2002.
*/ enum cip_sfc {
CIP_SFC_32000 = 0,
CIP_SFC_44100 = 1,
CIP_SFC_48000 = 2,
CIP_SFC_88200 = 3,
CIP_SFC_96000 = 4,
CIP_SFC_176400 = 5,
CIP_SFC_192000 = 6,
CIP_SFC_COUNT
};
/* For a PCM substream processing. */ struct snd_pcm_substream *pcm; struct work_struct period_work;
snd_pcm_uframes_t pcm_buffer_pointer; unsignedint pcm_period_pointer; unsignedint pcm_frame_multiplier;
// To start processing content of packets at the same cycle in several contexts for // each direction. bool ready_processing;
wait_queue_head_t ready_wait; unsignedint next_cycle;
/* For backends to process data blocks. */ void *protocol;
amdtp_stream_process_ctx_payloads_t process_ctx_payloads;
// For domain. int channel; int speed; struct list_head list; struct amdtp_domain *domain;
};
/** * amdtp_stream_running - check stream is running or not * @s: the AMDTP stream * * If this function returns true, the stream is running.
*/ staticinlinebool amdtp_stream_running(struct amdtp_stream *s)
{ return !IS_ERR(s->context);
}
/** * amdtp_streaming_error - check for streaming error * @s: the AMDTP stream * * If this function returns true, the stream's packet queue has stopped due to * an asynchronous error.
*/ staticinlinebool amdtp_streaming_error(struct amdtp_stream *s)
{ return s->packet_index < 0;
}
/** * amdtp_stream_pcm_running - check PCM substream is running or not * @s: the AMDTP stream * * If this function returns true, PCM substream in the AMDTP stream is running.
*/ staticinlinebool amdtp_stream_pcm_running(struct amdtp_stream *s)
{ return !!s->pcm;
}
/** * amdtp_stream_pcm_trigger - start/stop playback from a PCM device * @s: the AMDTP stream * @pcm: the PCM device to be started, or %NULL to stop the current device * * Call this function on a running isochronous stream to enable the actual * transmission of PCM data. This function should be called from the PCM * device's .trigger callback.
*/ staticinlinevoid amdtp_stream_pcm_trigger(struct amdtp_stream *s, struct snd_pcm_substream *pcm)
{
WRITE_ONCE(s->pcm, pcm);
}
/** * amdtp_stream_next_packet_desc - retrieve next descriptor for amdtp packet. * @s: the AMDTP stream * @desc: the descriptor of packet * * This macro computes next descriptor so that the list of descriptors behaves circular queue.
*/ #define amdtp_stream_next_packet_desc(s, desc) \
list_next_entry_circular(desc, &s->packet_descs_list, link)
/** * amdtp_domain_wait_ready - sleep till being ready to process packets or timeout * @d: the AMDTP domain * @timeout_ms: msec till timeout * * If this function return false, the AMDTP domain should be stopped.
*/ staticinlinebool amdtp_domain_wait_ready(struct amdtp_domain *d, unsignedint timeout_ms)
{ struct amdtp_stream *s;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.