parent
							
								
									efbf287305
								
							
						
					
					
						commit
						638ccffda0
					
				| @ -1,70 +0,0 @@ | ||||
| //
 | ||||
| // Created by frank on 2021/08/08.
 | ||||
| //
 | ||||
| #include "block_queue.h" | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| vlc_queue_t *vlc_queue_init(int size) { | ||||
|     vlc_queue_t *queue = (vlc_queue_t *)(malloc(sizeof(vlc_queue_t))); | ||||
|     queue->size = size; | ||||
|     queue->next_to_read = 0; | ||||
|     queue->next_to_write = 0; | ||||
|     int i; | ||||
|     queue->packets = (void **)(malloc(sizeof(*queue->packets) * size)); | ||||
|     for (i = 0; i < size; i++) { | ||||
|         block_t *packet = malloc(sizeof(block_t)); | ||||
|         packet->i_nb_samples = 0; | ||||
|         queue->packets[i] = packet; | ||||
|     } | ||||
|     pthread_mutex_init(&queue->mutex, NULL); | ||||
|     pthread_cond_init(&queue->cond, NULL); | ||||
|     return queue; | ||||
| } | ||||
| 
 | ||||
| void vlc_queue_free(vlc_queue_t *queue) { | ||||
|     int i; | ||||
|     for (i = 0; i < queue->size; i++) { | ||||
|         free(queue->packets[i]); | ||||
|     } | ||||
|     free(queue->packets); | ||||
|     free(queue); | ||||
|     pthread_cond_destroy(&queue->cond); | ||||
|     pthread_mutex_destroy(&queue->mutex); | ||||
| } | ||||
| 
 | ||||
| int vlc_queue_next(vlc_queue_t *queue, int current) { | ||||
|     return (current + 1) % queue->size; | ||||
| } | ||||
| 
 | ||||
| void *vlc_queue_push(vlc_queue_t *queue, void *data) { | ||||
|     pthread_mutex_lock(&queue->mutex);//lock
 | ||||
|     int current = queue->next_to_write; | ||||
|     int next_to_write; | ||||
|     for (;;) { | ||||
|         next_to_write = vlc_queue_next(queue, current); | ||||
|         if (next_to_write != queue->next_to_read) { | ||||
|             break; | ||||
|         } | ||||
|         pthread_cond_wait(&queue->cond, &queue->mutex); | ||||
|     } | ||||
|     queue->next_to_write = next_to_write; | ||||
|     queue->packets[current] = data;//TODO
 | ||||
|     pthread_cond_broadcast(&queue->cond); | ||||
|     pthread_mutex_unlock(&queue->mutex);//unlock
 | ||||
|     return queue->packets[current]; | ||||
| } | ||||
| 
 | ||||
| void *vlc_queue_pop(vlc_queue_t *queue) { | ||||
|     pthread_mutex_lock(&queue->mutex); | ||||
|     int current = queue->next_to_read; | ||||
|     for (;;) { | ||||
|         if (queue->next_to_write != queue->next_to_read) { | ||||
|             break; | ||||
|         } | ||||
|         pthread_cond_wait(&queue->cond, &queue->mutex); | ||||
|     } | ||||
|     queue->next_to_read = vlc_queue_next(queue, current); | ||||
|     pthread_cond_broadcast(&queue->cond); | ||||
|     pthread_mutex_unlock(&queue->mutex); | ||||
|     return queue->packets[current]; | ||||
| } | ||||
| @ -1,57 +0,0 @@ | ||||
| //
 | ||||
| // Created by frank on 2021/08/08.
 | ||||
| //
 | ||||
| 
 | ||||
| #ifndef BLOCK_QUEUE_H | ||||
| #define BLOCK_QUEUE_H | ||||
| 
 | ||||
| #include <pthread.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef int64_t vlc_tick_t; | ||||
| 
 | ||||
| typedef struct FFT_callback { | ||||
|     void (*callback)(void*); | ||||
| } FFT_callback; | ||||
| 
 | ||||
| typedef struct block_t { | ||||
|     uint8_t    *p_buffer; /** Payload start */ | ||||
| 
 | ||||
|     unsigned    i_nb_samples; /** Used for audio */ | ||||
| 
 | ||||
|     vlc_tick_t  i_pts; | ||||
|     vlc_tick_t  i_length; | ||||
| 
 | ||||
|     FFT_callback fft_callback; | ||||
| } block_t; | ||||
| 
 | ||||
| typedef struct vlc_queue { | ||||
|     //the size of queue
 | ||||
|     int size; | ||||
|     //packet array
 | ||||
|     void **packets; | ||||
|     //the packet next to write
 | ||||
|     int next_to_write; | ||||
|     //the packet next to read
 | ||||
|     int next_to_read; | ||||
| 
 | ||||
|     pthread_mutex_t mutex; | ||||
|     pthread_cond_t cond; | ||||
| } vlc_queue_t; | ||||
| 
 | ||||
| vlc_queue_t *vlc_queue_init(int size); | ||||
| 
 | ||||
| void vlc_queue_free(vlc_queue_t *queue); | ||||
| 
 | ||||
| void *vlc_queue_push(vlc_queue_t *queue, void *data); | ||||
| 
 | ||||
| void *vlc_queue_pop(vlc_queue_t *queue); | ||||
| 
 | ||||
| #endif //BLOCK_QUEUE_H
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
					Loading…
					
					
				
		Reference in new issue