| | 326 | /* |
|---|
| | 327 | * Date management (internal and external) |
|---|
| | 328 | */ |
|---|
| | 329 | |
|---|
| | 330 | /** |
|---|
| | 331 | * Initialize a date_t. |
|---|
| | 332 | * |
|---|
| | 333 | * \param date to initialize |
|---|
| | 334 | * \param divider (sample rate) numerator |
|---|
| | 335 | * \param divider (sample rate) denominator |
|---|
| | 336 | */ |
|---|
| | 337 | |
|---|
| | 338 | void date_Init( date_t *p_date, uint32_t i_divider_n, uint32_t i_divider_d ) |
|---|
| | 339 | { |
|---|
| | 340 | p_date->date = 0; |
|---|
| | 341 | p_date->i_divider_num = i_divider_n; |
|---|
| | 342 | p_date->i_divider_den = i_divider_d; |
|---|
| | 343 | p_date->i_remainder = 0; |
|---|
| | 344 | } |
|---|
| | 345 | |
|---|
| | 346 | /** |
|---|
| | 347 | * Change a date_t. |
|---|
| | 348 | * |
|---|
| | 349 | * \param date to change |
|---|
| | 350 | * \param divider (sample rate) numerator |
|---|
| | 351 | * \param divider (sample rate) denominator |
|---|
| | 352 | */ |
|---|
| | 353 | |
|---|
| | 354 | void date_Change( date_t *p_date, uint32_t i_divider_n, uint32_t i_divider_d ) |
|---|
| | 355 | { |
|---|
| | 356 | p_date->i_divider_num = i_divider_n; |
|---|
| | 357 | p_date->i_divider_den = i_divider_d; |
|---|
| | 358 | } |
|---|
| | 359 | |
|---|
| | 360 | /** |
|---|
| | 361 | * Set the date value of a date_t. |
|---|
| | 362 | * |
|---|
| | 363 | * \param date to set |
|---|
| | 364 | * \param date value |
|---|
| | 365 | */ |
|---|
| | 366 | void date_Set( date_t *p_date, mtime_t i_new_date ) |
|---|
| | 367 | { |
|---|
| | 368 | p_date->date = i_new_date; |
|---|
| | 369 | p_date->i_remainder = 0; |
|---|
| | 370 | } |
|---|
| | 371 | |
|---|
| | 372 | /** |
|---|
| | 373 | * Get the date of a date_t |
|---|
| | 374 | * |
|---|
| | 375 | * \param date to get |
|---|
| | 376 | * \return date value |
|---|
| | 377 | */ |
|---|
| | 378 | mtime_t date_Get( const date_t *p_date ) |
|---|
| | 379 | { |
|---|
| | 380 | return p_date->date; |
|---|
| | 381 | } |
|---|
| | 382 | |
|---|
| | 383 | /** |
|---|
| | 384 | * Move forwards or backwards the date of a date_t. |
|---|
| | 385 | * |
|---|
| | 386 | * \param date to move |
|---|
| | 387 | * \param difference value |
|---|
| | 388 | */ |
|---|
| | 389 | void date_Move( date_t *p_date, mtime_t i_difference ) |
|---|
| | 390 | { |
|---|
| | 391 | p_date->date += i_difference; |
|---|
| | 392 | } |
|---|
| | 393 | |
|---|
| | 394 | /** |
|---|
| | 395 | * Increment the date and return the result, taking into account |
|---|
| | 396 | * rounding errors. |
|---|
| | 397 | * |
|---|
| | 398 | * \param date to increment |
|---|
| | 399 | * \param incrementation in number of samples |
|---|
| | 400 | * \return date value |
|---|
| | 401 | */ |
|---|
| | 402 | mtime_t date_Increment( date_t *p_date, uint32_t i_nb_samples ) |
|---|
| | 403 | { |
|---|
| | 404 | mtime_t i_dividend = (mtime_t)i_nb_samples * 1000000; |
|---|
| | 405 | p_date->date += i_dividend / p_date->i_divider_num * p_date->i_divider_den; |
|---|
| | 406 | p_date->i_remainder += (int)(i_dividend % p_date->i_divider_num); |
|---|
| | 407 | |
|---|
| | 408 | if( p_date->i_remainder >= p_date->i_divider_num ) |
|---|
| | 409 | { |
|---|
| | 410 | /* This is Bresenham algorithm. */ |
|---|
| | 411 | p_date->date += p_date->i_divider_den; |
|---|
| | 412 | p_date->i_remainder -= p_date->i_divider_num; |
|---|
| | 413 | } |
|---|
| | 414 | |
|---|
| | 415 | return p_date->date; |
|---|
| | 416 | } |
|---|