87 lines
1.7 KiB
C
87 lines
1.7 KiB
C
/*
|
||
* mymidififo.c
|
||
*
|
||
* Created on: Jun 12, 2025
|
||
* Author: 19120
|
||
*/
|
||
#include "mymidififo1.h"
|
||
#include <string.h>
|
||
|
||
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;
|
||
}
|