/* * mymidififo.c * * Created on: Jun 12, 2025 * Author: 19120 */ #include "mymidififo1.h" #include void mymidififo_init(MidiFifoSeq_t *rb) { rb->front = 0; rb->rear = 0; } int mymidififo_InQueue(MidiFifoSeq_t *rb,MidiFifoItem_t* pFrame) { int rear = rb->rear; int front = rb->front; //如果队列已满,则入队失败 if ((rear + 1) % MIDI_FIFO_MAX_LEN == front) { return -1; } //入队操作 memcpy(&(rb->frame[rear]), pFrame, sizeof(MidiFifoItem_t));//赋值入队元素 rear = (rear + 1) % MIDI_FIFO_MAX_LEN;//计算入队后尾指针的位置 rb->rear = rear; return 0; } MidiFifoItem_t* mymidififo_DeQueue(MidiFifoSeq_t *rb) { MidiFifoItem_t* pFrame; int rear = rb->rear; int front = rb->front; //如果队列为空,则出队失败 if (rear == front) { return NULL; } //出队操作,并不实施copy,这样效率较高 pFrame = &(rb->frame[front]); front = (front + 1) % MIDI_FIFO_MAX_LEN;//计算出队后头指针的位置 rb->front = front; return pFrame; } MidiFifoItem_t* mymidififo_TryDeQueue(MidiFifoSeq_t *rb) { MidiFifoItem_t* pFrame; int rear = rb->rear; int front = rb->front; //如果队列为空,则出队失败 if (rear == front) { return NULL; } //出队操作,并不实施copy,这样效率较高 pFrame = &(rb->frame[front]); //front = (front + 1) % MIDI_FIFO_MAX_LEN;//计算出队后头指针的位置 //rb->front = front; return pFrame; } int mymidififo_GetQueueLength(MidiFifoSeq_t *rb) { return (rb->rear - rb->front + MIDI_FIFO_MAX_LEN) % MIDI_FIFO_MAX_LEN; } int mymidififo_IsQueueFull(MidiFifoSeq_t *rb) { if ((rb->rear + 1) % MIDI_FIFO_MAX_LEN == rb->front) return 1; else return 0; } int mymidififo_IsQueueEmpty(MidiFifoSeq_t *rb) { if(rb->front == rb->rear) return 1; else return 0; }