windows.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:3k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. **
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU Lesser General Public License as published by
  6. ** the Free Software Foundation; either version 2.1 of the License, or
  7. ** (at your option) any later version.
  8. **
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU Lesser General Public License for more details.
  13. **
  14. ** You should have received a copy of the GNU Lesser General Public License
  15. ** along with this program; if not, write to the Free Software
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. /*
  19. ** This needs to be a separate file so that we don't have to include
  20. ** <windows.h> elsewhere (too many symbol clashes).
  21. */
  22. #include "sfconfig.h"
  23. #if OS_IS_WIN32
  24. #include <windows.h>
  25. #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
  26. #include "sndfile.h"
  27. #include "common.h"
  28. extern int sf_errno ;
  29. static void copy_filename (SF_PRIVATE * psf, LPCWSTR wpath) ;
  30. SNDFILE*
  31. sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo)
  32. { SF_PRIVATE  *psf ;
  33. char utf8name [512] ;
  34. if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
  35. { sf_errno = SFE_MALLOC_FAILED ;
  36. return NULL ;
  37. } ;
  38. memset (psf, 0, sizeof (SF_PRIVATE)) ;
  39. psf_init_files (psf) ;
  40. if (WideCharToMultiByte (CP_UTF8, 0, wpath, -1, utf8name, sizeof (utf8name), NULL, NULL) == 0)
  41. psf->file.path.wc [0] = 0 ;
  42. psf_log_printf (psf, "File : '%s' (utf-8 converted from ucs-2)n", utf8name) ;
  43. copy_filename (psf, wpath) ;
  44. psf->file.use_wchar = SF_TRUE ;
  45. psf->file.mode = mode ;
  46. psf->error = psf_fopen (psf) ;
  47. return psf_open_file (psf, sfinfo) ;
  48. } /* sf_wchar_open */
  49. static void
  50. copy_filename (SF_PRIVATE *psf, LPCWSTR wpath)
  51. { const wchar_t *cwcptr ;
  52. wchar_t *wcptr ;
  53. wcsncpy (psf->file.path.wc, wpath, ARRAY_LEN (psf->file.path.wc)) ;
  54. psf->file.path.wc [ARRAY_LEN (psf->file.path.wc) - 1] = 0 ;
  55. if ((cwcptr = wcsrchr (wpath, '/')) || (cwcptr = wcsrchr (wpath, '\')))
  56. cwcptr ++ ;
  57. else
  58. cwcptr = wpath ;
  59. wcsncpy (psf->file.name.wc, cwcptr, ARRAY_LEN (psf->file.name.wc)) ;
  60. psf->file.name.wc [ARRAY_LEN (psf->file.name.wc) - 1] = 0 ;
  61. /* Now grab the directory. */
  62. wcsncpy (psf->file.dir.wc, wpath, ARRAY_LEN (psf->file.dir.wc)) ;
  63. psf->file.dir.wc [ARRAY_LEN (psf->file.dir.wc) - 1] = 0 ;
  64. if ((wcptr = wcsrchr (psf->file.dir.wc, '/')) || (wcptr = wcsrchr (psf->file.dir.wc, '\')))
  65. wcptr [1] = 0 ;
  66. else
  67. psf->file.dir.wc [0] = 0 ;
  68. return ;
  69. } /* copy_filename */
  70. #endif